(Следует признать, что это удар в воздух, так как фрагмент кода не раскрывает ни детали приложения, ни базовые структуры.)
жен портировать исходный код с платформы ARM, на которой работает Linux. К сожалению, у меня возникли проблемы с выравниванием памяти. Источник использует приведения указателей и интенсивный доступ.
Код, подобный приведенному ниже, распространился по кодовой базе как вирус. Я могу точно определить проблемные места благодаря GCC-Wcast-align
опция командной строки, но есть более тысячи экземпляров, чтобы пройти.
u = (IEC_BOOL);
(((*(IEC_LINT*)pSP).H < b.H)
|| (((*(IEC_LINT*)pSP).H == b.H) && ((*(IEC_LINT*)pSP).L < b.L) )) ? 1 : 0);
*(IEC_DWORD OS_SPTR *)pSP =
(IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP >> u);
*(IEC_DWORD OS_SPTR *)pSP =
(IEC_DWORD)(*(IEC_DWORD OS_SPTR *)pSP << -u);
u = (IEC_BYTE)((*(IEC_DINT*)pSP != b) ? 1 : 0);
*(IEC_DWORD*)pSP = (IEC_DWORD)(*(IEC_DWORD*)pSP & w);
(*(IEC_ULINT*)pSP).H += u.H;
(((*(IEC_ULINT OS_SPTR *)pSP).H == b.H)
&& ((*(IEC_ULINT OS_SPTR *)pSP).L > b.L))) ? 1 : 0);
u = (IEC_BYTE)((*(IEC_REAL*)pSP >= b) ? 1 : 0);
С помощьюecho 2 > /proc/cpu/alignment
Это заставляет ядро Linux устранять проблемы, но производительность приложения снижается до уровня, который больше не является приемлемым.
Я искал в сети что-то вроде__unaligned
или же__packed
Ключевое слово для компилятора GCC (v4.4.1), но пока пустое.
Я подумал, что многие строки кодов поблекматизма можно исправить с помощью более или менее сложного регулярного выражения / замены, но теперь, после того, как я это сделаю некоторое время, я также увижу, что этот подход потребует огромного количества утомительной работы.
Ребята, у вас есть предложения, как выполнить эту работу? Я думаю, что плагин компилятора gcc 4.5 был бы излишним, но есть ли что-то лучше, чем регулярные выражения? какие еще предложения вы можете придумать? Не обязательно все проблемные случаи должны быть исправлены, так как я все еще могу положиться на Ядро для нескольких более редких случаев.