Я хотел бы создать 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, как указано в docs , примерно так:
struct __attribute__ ((aligned (32))) MyStruct
{
// ...
};
И, таким образом, я мог заставить этот тип синтаксиса работать:
ALIGNED_STRUCT(32) MyStruct
{
// ...
};
У кого-нибудь есть лучшие версии? Другие идеи?
Я попытался немного поискать код, но не нашел ничего слишком многообещающего.
Обновление: На основании комментария @ Джона, вот еще одна версия, которая может работать (я не скомпилировал ее, но документы показывают, что это хорошая идея)
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