<stdalign.h>头文件
完整对象类型都有对齐要求,给完整对象类型的对象分配地址时会受对齐要求的限制。对齐是实现定义的整数值,表示可以分配给指定对象的连续地址的字节数。对象类型的每个对象都有对齐要求;可以使用关键词_Alignas请求更严格的对齐。
基本对齐(fundamental alignment)是小于或者等于_Alignof(max_align_t)的有效对齐。实现应支持所有存储期限的对象的基本对齐。以下类型的对齐应为基本对齐:
- 所有原子的、限定的或者非限定的基本类型;
- 所有原子的、限定的或者非限定的枚举类型;
- 所有原子的、限定的或者非限定的指针类型;
- 元素类型具有基本对齐要求的所有数组类型;
- ISO/IEC 9899:2018标准第7 Library章中指定为完整对象类型的所有类型;
- 所有元素都是具有基本对齐要求的类型,并且没有元素具有指定非基本对齐的对齐说明符的结构或者联合类型。
扩展对齐(extended alignment)是大于_Alignof(max_align_t)的对齐表示。是否支持扩展对齐以及是否支持扩展对齐的存储期限将由实现定义。具有扩展对齐要求的类型是过度对齐类型(over-aligned type)。每个过度对齐类型都是或者包含一个结构或者联合类型,其成员已应用扩展对齐。
对齐表示为size_t类型的值。有效对齐仅包括基本对齐,以及额外的实现定义的值集,这些值可能为空。每个有效的对齐值应是2的非负整数幂。
对齐具有从弱到强或者更严格的对齐顺序。更严格的对齐具有更大的对齐值。满足更严格对齐要求的地址也满足任何较弱的有效对齐。
可以使用_Alignof表达式查询完整类型的对齐要求。char、signed char和unsigned char类型应具有最弱的对齐要求。
比较对齐:
- 当两个对齐的数值相等时,两个对齐是相等的。
- 当两个对齐的数值不相等时,两个对齐是不同的。
- 当一个对齐大于另一个对齐时,它表示更严格的对齐。
<stdalign.h>头文件定义了四个宏,具体如下:
宏(macro):alignas | 扩展为关键词_Alignas的宏。 |
alignof | 扩展为关键词_Alignof的宏。 |
__alignas_is_defined | 判断是否定义alignas的宏。 |
__alignof_is_defined | 判断是否定义alignof的宏。 |