(Следует признать, что это удар в воздух, так как фрагмент кода не раскрывает ни детали приложения, ни базовые структуры.)

жен портировать исходный код с платформы 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 был бы излишним, но есть ли что-то лучше, чем регулярные выражения? какие еще предложения вы можете придумать? Не обязательно все проблемные случаи должны быть исправлены, так как я все еще могу положиться на Ядро для нескольких более редких случаев.

Ответы на вопрос(3)

Ваш ответ на вопрос