#cpp
Есть ли способ выравнять размер структуры кратно определенному значению? С помощью дополнительных байтов к конце структуры или между её полями. Пока делаю так: #define PADDING(s, a) uint8_t _padding_bytes[(((s + a - 1) / a) * a)] #pragma pack(push) #pragma pack(1) struct Foo { int a; }; union FooPadded { Foo foo; PADDING(sizeof(Foo), 16); }; #pragma pack(pop) update В идеале получить универсальное решение, в том числе для компиляторов, не поддерживающих c++11, для моего конкретного случая требуется поддержка MSVC2010 и armcc5.1.
Ответы
Ответ 1
Используйте #pragma pack(16). Тогда ваш код будет выглядеть так: #pragma pack(push, 16) struct Foo { int a; }; #pragma pack(pop) Если используется GCC, то выравнивание можно задать следующим образом: struct Foo { int a; } __attribute__((aligned(16))); UPD (на комментарий 1). С использованием pack, да - выравниваются адреса. А с использованием __attribute__ - размер структуры будет равен 16. Пример использования. UPD (на комментарий 2). Это верное замечание, но __attribute__ в VS уже не прокатит. UPD В VS можно попробовать такой вариант: __declspec(align(16)) struct Foo { int a; }; В VS2015, поскольку он поддерживает стандарт C++11 можно ещё и так struct alignas(16) Foo { int a; }; Кстати последний вариант работает и в GCC. Вот проверка.
Комментариев нет:
Отправить комментарий