控制对齐

Version >= C++ 11

alignas 关键字可用于强制变量,类数据成员,类的声明或定义,或枚举的声明或定义,以获得特定的对齐(如果支持)。它有两种形式:

  • alignas(x),其中 x 是常量表达式,如果支持,则为实体提供对齐 x
  • alignas(T),其中 T 是一个类型,给实体一个等于 T 的对齐要求的对齐,即 alignof(T),如果支持的话。

如果将多个 alignas 说明符应用于同一实体,则应用最严格的说明符。

在这个例子中,保证缓冲区 buf 被适当地对齐以保持 int 对象,即使它的元素类型是 unsigned char,其可能具有较弱的对齐要求。

alignas(int) unsigned char buf[sizeof(int)];
new (buf) int(42);

alignas 不能用于为类型提供比没有此声明时类型更小的对齐:

alignas(1) int i; //Il-formed, unless `int` on this platform is aligned to 1 byte.
alignas(char) int j; //Il-formed, unless `int` has the same or smaller alignment than `char`.

alignas,当给定整数常量表达式时,必须给出有效的对齐方式。有效对齐始终为 2 的幂,且必须大于零。编译器需要支持所有有效的对齐,直到 std::max_align_t 的对齐方式。它们可能支持比这更大的对齐,但是为这些对象分配内存的支持是有限的。对齐的上限取决于实现。

C++ 17 在 operator new 中提供直接支持,用于为过度对齐类型分配内存。