Выравнивание в компиляторе SunStudio C++

Мне нужно объявить псевдоним типа для 2-байтовой переменной, выровненной на 4 байта.

В GCC, XL C/C++ (AIX), aCC (HP-UX) я могу использовать этот код:

typedef uint16_t AlignedType __attribute__ ((aligned (4)));

В Windows я могу использовать:

typedef __declspec(align(4)) unsigned __int16 AlignedType;

Как я могу объявить тот же тип в SunStudio C++ 11?

"Pragma align" не подходит, потому что он работает только для глобальной или статической переменной и требует имени переменной.

4 ответа

Начиная с Sun C 5.9 (Sun ONE Studio 12) поддерживается выравниваемый атрибут:

typedef uint16_t AlignedType __attribute__ ((aligned (4)));

К сожалению, этот атрибут не поддерживается в C++ (по крайней мере, в Sun C++ 5.10).

Возможно, стоит хотя бы попытаться:

typedef union {
  uint16_t value;
  uint32_t _dummy;
} AlignedType;

Это, конечно, делает доступ немного более болезненным и убивает прямое назначение, так что это может сломать всю вашу кодовую базу. Кроме того, он основан исключительно на предположении, что включение большего типа, который, как предполагается, имеет "собственное выравнивание" в 32 бита из-за его размера, делает union в целом выровняйте на 32 бита.

Для будущих ссылок, когда компиляторы догонят, C++11 имеет стандартные атрибуты выравнивания, см. alignas ([dcl.align] в N3242).

Начиная с Sun C++ 5.12 SunOS_sparc 2011/11/16, синтаксис gcc, по-видимому, поддерживается для C++ согласно ответу DRH:

typedef uint16_t AlignedType8 __attribute__ ((aligned (8)));
typedef uint16_t AlignedType4 __attribute__ ((aligned (4)));
typedef uint16_t AlignedType2 __attribute__ ((aligned (2)));
cout << __alignof__(AlignedType8) << ' ' << __alignof__(AlignedType4) << ' ' << __alignof__(AlignedType2) << endl;

Выход:

8 4 2

Другие вопросы по тегам