ISO/IEC 14882:2011之条款3.11——对齐
3.11 对齐
1、对象类型具有对齐要求(3.9.1,3.9.2),该要求对该类型的一个对象可能被分配在的地址有所限制。一个对齐是一个实现定义的整型值,表示在一个所给对象可以被分配的相继地址[译者注:即比如一个对象可以分配在4字节对齐的地址上,那么比如0、4就是相继地址]之间的字节数。一个对象类型在该类型的每个对象上使用一个对齐要求;通过使用对齐指示符可以要求更严格的对齐(7.6.2)。
2、一个基本的对齐通过小于等于在所有上下文中由实现所支持的最大对齐的一个对齐来表示。最大对齐等于alignof(std::max_align_t)(18.2)。一个类型所需要的对齐在它被用作为一个完整对象时和被用作为一个子对象的类型时可能会有所不同。[例:
struct B { long double d; }; struct D : virtual B { char c; };
当D是一个完整对象类型时,它将有类型B的一个子对象,这样它必须用一个long double来做适当的对齐。如果D作为另一个对象一个子对象出现,而B也作为一个虚基类,那么B子对象可能是一个不同子对象的部分,减少了对D子对象的对齐要求。——例结束]alignof操作符的结果反映了完整对象情况下的对齐要求。
3、一个扩展对齐由一个比alignof(std::max_align_t)更大的对齐来表示。扩展对齐是否支持以及它们在什么上下文环境下被支持是由实现定义的(7.6.2)。具有一个扩展对齐要求的一个类型是一个过对齐类型。[注:每个过对齐类型是或包含扩展对齐所应用的一个类类型(可能通过一个非静态数据成员)。——注结束]
4、对齐作为std::size_t类型的值来表示。有效的实参仅包括那些由一个作用于基本类型的alignof表达式所返回的值,加上一个额外的由实现定义的值的非空集合。每个对齐值应该是一个非负的二的整数幂。
5、对齐具有从较弱到较强或较严格对齐的次序。较严格对齐具有更大的对齐值。满足一个对齐要求的一个地址也满足任一更弱的有效对齐要求。
6、一个完整类型的对齐要求可以通过使用一个alignof表达式来查询(5.3.6)。此外,类型char、signed char、unsigned char应该有最弱的对齐要求。[注:这允许字符类型被用作为一个对齐的存储区域的基础类型(7.6.2)。——注结束]
7、比较对齐是有意义的并提供明显的结果:
——当两个对齐的数值相等时,它们是相等的。
——当两个对齐的数值不相等时,它们是不等的。
——当一个对齐的数值比另一个大时,它表示更严格的对齐。
8、[注:运行时指针对齐函数(20.6.5)可以被用来在一个缓存内获取一个对齐的指针;库中的对齐存储模板(20.9.7.6)可以被用来获取对齐的存储。——注结束]
9、如果在一个特定上下文中的一个特定的扩展对齐的一个要求没有被一个实现支持,那么程序是不良形式的。此外,对动态存储的运行时分配的一个请求——而该请求的对齐不能被满足——应该被对待为分配失败。