コードを標準化し、移植性を高めるために、次のように置き換えました。
#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年4月):
標準の関連記事は 7.6.2、特に 7.6.2.1 です。
アライメント指定子は、変数またはクラス データ メンバーに適用できますが、ビット フィールド、関数パラメーター、catch 句の仮パラメーター (15.3)、または で宣言された変数には適用してはなりません。ストレージ クラス指定子を登録します。アライメント指定子は、クラスまたは列挙型の宣言にも適用できます。省略記号付きの配置指定子は、パック展開 (14.5.3) です。
すでにレッドXIIIによって掘り出されたように。ただし、上記のテストでこれが何を意味するかを知るには、私は十分な専門家ではありません。
using
clang が私の属性を受け入れるという事実が何かを意味する場合、 の代わりにディレクティブを使用しようとするとtypedef
、clang も文句を言うことに言及する価値があるかもしれません。また、この質問の以前のバージョンのステートメントとは対照的に、gcc は警告するだけでなく、実際にアライメントに対する私の希望を無視します。