__declspec(align(X))
__attribute((aligned(X)))
Run Code Online (Sandbox Code Playgroud)
这是我遇到过的两个。它们是编译器处理对齐的唯一两种方法吗?
如果我以 C11 为目标,会alignas(X)完成同样的事情,它是否在所有支持 C11 的编译器中实现?在 macOS 上使用 clang 似乎alignas(X)不适用于 typedef?
typedef alignas(16) float vec4[4];
error: '_Alignas' attribute only applies to variables and fields
^
Run Code Online (Sandbox Code Playgroud)
问题不在于 macOS 上的 clang,而在于其他编译器允许(实际上是C 中的alignas()宏) 1(大概是作为扩展)。_Alignas()typedef
来自cppreference(粗体我的):
\n\n\n仅当声明
\n_Alignas不包含位字段且不具有寄存器存储类的对象时才能使用说明符。它不能在函数参数声明中使用,也不能在 typedef 中使用。
或者,从这个 C11 标准草案:
\n\n\n6.7.5 对齐说明符
\n\xe2\x80\xa6
\n
\n约束\n2 \xc2\xa0\xc2\xa0\xc2\xa0 不得在、 位域、函数或参数的
声明中指定对齐属性,typedef或使用存储类说明符声明的对象register。
1该alignas关键字是在 C++11 标准中引入到 C++ 中的;ISO C11 将其添加为关键字的“别名” _Alignas。来自C++ 版本的 cppreference:
\n\n从 ISO C11 标准开始,C 语言具有
\n_Alignas关键字\n并定义alignas为扩展到标头\n中的关键字的预处理器宏<stdalign.h>。