В попытке стандартизировать мой код и сделать его более переносимым, я заменил
#ifdef __GNUC__
typedef __attribute__((aligned(16))) float aligned_block[4];
#else
typedef __declspec(align(16)) float aligned_block[4];
#endif
с
typedef float alignas(16) aligned_block[4];
в С++ 11. Однако gnu (4.8) не нравится, но жалуется
test.cc:3:9: warning: attribute ignored [-Wattributes]
typedef float alignas(16) aligned_block[4];
^
test.cc:3:9: note: an attribute that appertains to a type-specifier is ignored
тогда как clang 3.2 не создает предупреждения (даже с -Weverything -Wno-c++98-compat -pedantic
).
Поэтому я задаюсь вопросом, является ли мой код выше правильным и, в более общем плане, где alignas()
может и не может быть размещен.
EDIT (апрель 2013 г.):
Соответствующей статьей стандарта является 7.6.2, в частности 7.6.2.1
Спецификатор выравнивания может применяться к переменной или к члену данных класса, но он не должен применяться к битовому полю, параметру функции, формальному параметру положения catch (15.3) или переменной объявлен с помощью спецификатора класса хранения регистров. Спецификатор выравнивания может также применяться к объявлению класса или типа перечисления. Спецификатор выравнивания с эллипсисом представляет собой расширение пакета (14.5.3).
как уже было выкопано Red XIII. Тем не менее, я недостаточно эксперт, чтобы узнать, что это значит для моего теста выше.
Если факт, что clang принимает мой атрибут, означает что-нибудь, возможно, стоит упомянуть, что при попытке использовать директиву using
вместо typedef
, clang также жалуется. Кроме того, вопреки утверждению в более ранней версии этого вопроса gcc не только предупреждает, но и игнорирует мое желание выравнивания.