相关疑难解决方法(0)

我在哪里可以在C++ 11中使用alignas()?

为了使我的代码标准化并使其更具可移植性,我更换了

#ifdef __GNUC__
typedef __attribute__((aligned(16))) float aligned_block[4];
#else
typedef __declspec(align(16)) float aligned_block[4];
#endif
Run Code Online (Sandbox Code Playgroud)

typedef float alignas(16) aligned_block[4];
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

而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).

正如Red XIII已经挖出来的那样.但是,我不够专业,不知道这对我上面的测试意味着什么.

如果clang接受我的属性这一事实意味着什么,那么也许值得一提的是,当试图使用using指令代替a时typedef,clang也会抱怨.此外,与此问题的早期版本中的陈述相反,gcc不仅警告,而且实际上忽略了我对齐的愿望.

c++ alignment c++11 alignas

32
推荐指数
3
解决办法
1万
查看次数

标签 统计

alignas ×1

alignment ×1

c++ ×1

c++11 ×1