Я хотел бы создать struct
, который имеет определенное выравнивание.
Я хотел бы использовать одно и то же определение struct для компиляторов GCC и VisualC++.
В VisualC++ обычно делают так:
__declspec(align(32))
struct MyStruct
{
// ...
};
В GCC обычно делают так:
struct MyStruct
{
// ...
} __attribute__ ((aligned (32)));
Я мог бы, конечно, создать соответствующие макросы, чтобы это работало:
BEGIN_ALIGNED_STRUCT(32)
struct
{
// ...
}
END_ALIGNED_STRUCT(32)
;
И таким образом иметь возможность прозрачно обрабатывать оба случая, но здесь мне придется дублировать константу выравнивания (32
), чего я хотел бы избежать.
Альтернативой в GCC является размещение __attribute__
после тега struct, как указано в документации, примерно так:
struct __attribute__ ((aligned (32))) MyStruct
{
// ...
};
И таким образом я мог бы заставить работать такой синтаксис:
ALIGNED_STRUCT(32) MyStruct
{
// ...
};
Есть ли у кого-нибудь лучшие варианты? Другие идеи? Я попробовал немного поискать код, но не нашел ничего слишком многообещающего.
Обновление: Основываясь на комментарии @John, вот еще одна версия, которая может работать (я не компилировал ее, но в документации указано, что это хорошая идея)
struct MyStruct_Unaligned
{
// ...
};
TYPEDEF_ALIGNED(32, MyStruct_Unaligned, MyStruct);
// Would expand to one of:
//
// typedef __declspec(align(32)) MyStruct_Unaligned MyStruct;
//
// typedef struct __attribute__ ((aligned (32))) MyStruct_Unaligned MyStruct