控制对齐
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
中提供直接支持,用于为过度对齐类型分配内存。