#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. Вот проверка.
Комментариев нет:
Отправить комментарий