Я хотел бы создать struct
, который имеет определенное выравнивание.
Я хотел бы использовать то же определение структуры для компиляторов GCC и VisualС++.
В VisualС++ обычно это делается:
__declspec(align(32))
struct MyStruct
{
// ...
};
В GCC обычно выполняется следующее:
struct MyStruct
{
// ...
} __attribute__ ((aligned (32)));
Я мог бы, конечно, создать соответствующие макросы, чтобы сделать эту работу:
BEGIN_ALIGNED_STRUCT(32)
struct
{
// ...
}
END_ALIGNED_STRUCT(32)
;
И таким образом иметь возможность обрабатывать оба случая прозрачно, но здесь я должен дублировать константу выравнивания (32
), чего я бы хотел избежать.
Альтернативой в GCC является размещение __attribute__
после тега структуры, как указано в документах, например:
struct __attribute__ ((aligned (32))) MyStruct
{
// ...
};
И таким образом я мог бы сделать этот тип синтаксиса:
ALIGNED_STRUCT(32) MyStruct
{
// ...
};
Есть ли у кого-нибудь лучшие версии? Другие идеи? Я попробовал немного поиска кода, но не нашел ничего слишком многообещающего.
Обновление: Основываясь на комментарии @John, здесь другая версия, которая могла бы работать (я ее не скомпилировал, но документы указывают на ее идею OK)
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