#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()
可以放置在哪里以及不能放置在哪里。
编辑(Apr 2013):
有关标准的相关文章是7.6.2,特别是7.6.2.1
对变量或类数据成员可以应用对齐指定符,但不得应用于位域、函数参数、catch子句的形式参数(15.3)或使用register存储类说明符声明的变量。对齐指定符还可以应用于类或枚举类型的声明。带省略号的对齐指定符是一个包扩展(14.5.3)。
如Red XIII已经挖掘出来的那样。然而,我不够专业,不知道这对我上面的测试意味着什么。
如果clang接受我的属性这一事实有任何意义,也许值得提到的是,当尝试使用using
指令而不是typedef
时,clang也会发出警告。并且,与本问题早期版本中的一种陈述相反,gcc不仅会发出警告,而且确实忽略了我对齐的意愿。
-std=c++11
表示使用C++11标准进行编译,-Wextra
、-Wall
、-pedantic
为编译时的警告选项,可以检查代码中可能存在的问题。 - Walter