Мне нужно перенести исходный код с платформы 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
on заставляет ядро Linux исправлять проблемы, но производительность приложения снижается до неприемлемой точки.
Я поискал в сети что-то вроде __ unaligned
или __ упаковано
ключевое слово для компилятора GCC (v4.4.1), но пока не оказалось пустым.
Я думал, что многие проблемные строки кода можно исправить более или менее сложным regexp / replace, но теперь, сделав это некоторое время, я вижу, что этот подход также потребует огромного количества утомительной работы.
Ребята, у вас есть какие-нибудь предложения, как выполнить эту работу? Я думаю, что gcc 4. 5 было бы излишним, но есть ли что-то лучше, чем регулярные выражения? какие еще предложения вы можете придумать? Не обязательно все экземпляры проблем должны быть исправлены, поскольку я все еще могу полагаться на ядро в нескольких более редких случаях.