Пытаясь стандартизировать свой код и сделать его более переносимым, я заменил
#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()
можно и нельзя размещать.
РЕДАКТИРОВАНИЕ (апрель 2013 г.):
Соответствующей статьей стандарта является 7.6.2, в частности 7.6.2.1.
Спецификатор выравнивания может применяться к переменной или к члену данных класса, но он не должен применяться к битовому полю, параметру функции, формальному параметру предложения catch (15.3) или переменной, объявленной с помощью Зарегистрируйте спецификатор класса хранения. Спецификатор выравнивания также может применяться к объявлению класса или типа перечисления. Спецификатор выравнивания с многоточием является расширением пакета (14.5.3).
как уже раскопал Ред XIII. Однако я недостаточно эксперт, чтобы понять, что это означает для моего теста выше.
Если тот факт, что clang принимает мой атрибут, что-то значит, возможно, стоит упомянуть, что при попытке использовать директиву using
вместо typedef
clang также жалуется. Кроме того, вопреки утверждению в более ранней версии этого вопроса, gcc не только предупреждает, но и игнорирует мое желание выравнивания.
g++ -std=c++11 -Wextra -Wall -pedantic
- person Walter   schedule 03.04.2013