Кроссплатформенный макрос ALIGN(x)?

Я хотел бы создать 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

17
задан Tomas Kubes 5 April 2015 в 11:02
поделиться