对象类型具有对齐要求,这些要求限制了具有该类型的对象可能被分配的地址。 对齐 是一个由实现定义的整数值,表示在给定对象可以分配的连续地址之间的字节数。对象类型对该类型的每个对象都施加对齐要求;可以使用对齐说明符请求更严格的对齐。
基本对齐 由小于或等于实现支持的最大对齐的对齐表示,该最大对齐在所有上下文中都等于 alignof(std::max_align_t)
。当类型用作完整对象的类型时,其所需的对齐可能与用作子对象的类型时不同。[示例:
struct B { long double d; };
struct D : virtual B { char c; };
当 D
是完整对象的类型时,它将具有 B
类型的子对象,因此它必须针对 long double
进行适当的对齐。如果 D
出现在另一个对象中,该对象也具有 B
作为虚基类,那么 B
子对象可能是不同子对象的一部分,从而降低了对 D
子对象的对齐要求。 —示例结束] alignof
运算符的结果反映了完整对象情况下的类型对齐要求。
扩展对齐 由大于 alignof(std::max_align_t)
的对齐表示。是否支持任何扩展对齐以及支持它们的上下文由实现定义。具有扩展对齐要求的类型是过度对齐类型。[注意: 每个过度对齐类型都是或包含一个类类型,扩展对齐适用于该类类型(可能通过非静态数据成员)。 —注意结束]
对齐以 std::size_t
类型的值表示。有效的对齐仅包括基本类型的 alignof
表达式返回的值,再加上一组额外的由实现定义的可能为空的值。每个对齐值都应为非负的二的整数次幂。
对齐具有从弱到强或更严格的对齐顺序。更严格的对齐具有更大的对齐值。满足对齐要求的地址也满足任何较弱的有效对齐要求。
可以使用 alignof
表达式查询完整类型的对齐要求。此外,char
、signed char
和 unsigned char
类型应具有最弱的对齐要求。[注意: 这使得字符类型可以用作对齐内存区域的底层类型。 —注意结束]
比较对齐是有意义的,并提供明显的结果
[注意: 运行时指针对齐函数可用于在缓冲区内获取对齐的指针;库中的 aligned_storage
模板可用于获取对齐的存储。 —注意结束]
如果在特定上下文中请求的特定扩展对齐未被实现支持,则程序格式错误。此外,运行时动态存储分配的请求,如果无法满足所请求的对齐,则应被视为分配失败。