gcc, Выравнивание на 64-битных архитектурах
От: artem_korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 22.04.09 13:54
Оценка:
Столкнулся сегодня с одной проблемой. Есть структура данных, состоящая из нескольких полей — 64-битный float, потом 8 unsigned char и один Int32. Итого получается 20 байт (8 + 8*1 + 4). Под 32-битными системами sizeof равен 20 и всё работает нормально. А под 64-битным Linux'ом sizeof возвращает 24. Т.е. идёт выравнивание по границе 64 бит. Я пробовал добавлять в конец структуры директиву align:


struct ... {
    ...
} __attribute__ ((align(4)));


Не помогает. Всё равно sizeof возвращает 24. Проверял по отдельности — размеры каждого элемента правильные, т.е. 8 байт на Float64, по одному байту на каждый unsigned char и 4 байта на Int32.

Пока сделал маленький костыль, принудительно используя значение 20, вместо sizeof, но мне этот костыль не нравится, хочется сделать по-человечески. Что можно покурить для просветления?
С уважением, Artem Korneev.
gcc amd64
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.