Выравнивание в компиляторе 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;
Выход: