Атрибуты типа page для g cc, дают очень интересный пример того, как настроить выравнивание на псевдонимах типов:
typedef int more_aligned_int __attribute__ ((aligned (8)));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
В этом примере more_aligned_int
имеет другое выравнивание, чем int
, что становится очевидным при объявлении массива этих парней:
aligned_int ar[3];
output
error: alignment of array elements is greater than element size
aligned_int ar[3];
^
Стандартная альтернатива C ++ будет alignas
и хотя я был поражен, узнав, что вы действительно можете написать:
using aligned_int = int alignas(8);
компиляция выше дает:
warning: attribute ignored [-Wattributes]
using aligned_int = int alignas(8);
note: an attribute that appertains to a type-specifier is ignored
, поэтому нет побочного эффекта, и именно поэтому вышеупомянутое Объявление массива выполнено успешно. Время вопроса:
- Значит,
alignas
не эквивалентно атрибуту aligned
? - Есть ли другие отличия?
- Существует ли стандарт Кстати, для создания таких typedefs (настройки выравнивания) для встроенных типов?