В опит да стандартизирам кода си и да го направя по-преносим, замених
#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];
в C++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