Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Как получить структуру с размером кратным 16-и?

#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. Вот проверка.

Комментариев нет:

Отправить комментарий