6.2.8 对象的对齐
完全对象类型具有对齐要求,这会对该类型对象可以分配到哪些地址上施加限制。对齐值是一个由实现定义的整数,表示某种对象能够被分配到的相邻两个有效地址之间相隔多少字节。对象类型会对该类型的每个对象施加对齐要求;可以使用关键字
alignas请求更严格的对齐。基本对齐(fundamental alignment)是指:小于或等于
alignof(max_align_t)的有效对齐值。实现必须为所有存储期的对象支持基本对齐。下列类型的对齐要求都必须属于基本对齐:- 所有原子的、限定的或无限定的基本类型;
- 所有原子的、限定的或无限定的枚举类型;
- 所有原子的、限定的或无限定的指针类型;
- 其元素类型具有基本对齐要求的全部数组类型;
- 第 7 章中规定为完全对象类型的全部类型;
- 其元素类型都具有基本对齐要求,且没有任何元素通过对齐说明符指定非基本对齐的全部结构体或联合体类型。
扩展对齐(extended alignment)是指大于
alignof(max_align_t)的对齐值。实现是否支持任何扩展对齐,以及对哪些存储期支持扩展对齐,都由实现定义。具有扩展对齐要求的类型称为过度对齐类型(over-aligned type)。49)对齐值使用
size_t类型表示。有效对齐值只包含两部分:全部基本对齐值,以及另外一组由实现定义的值(这组值可以为空)。每个有效对齐值都必须是非负整数的 2 的幂。对齐之间存在从弱到强、从宽松到严格的顺序。越严格的对齐,其对齐值越大。满足某个对齐要求的地址,也必然满足任何更弱的有效对齐要求。
可以使用
alignof表达式查询完全类型的对齐要求。类型char、signed char和unsigned char必须具有最弱的对齐要求。比较对齐是有意义的,并且结果与直觉一致:
- 两个对齐值数值相等,则两者相等;
- 两个对齐值数值不等,则两者不同;
- 一个对齐值比另一个更大,就表示它更严格。
脚注说明
49)每种过度对齐类型,要么本身就是结构体或联合体类型,要么包含某个结构体或联合体成员,并且该成员被施加了扩展对齐。