有一句话来自参考参数 http://en.cppreference.com/w/cpp/language/object#Alignment:
每个对象类型都具有称为对齐要求的属性,该属性
是一个整数值(std::size_t 类型,始终是 2 的幂)
表示连续地址之间的字节数
可以分配该类型的对象。
据我了解,该参考文献是非规范性的。但没有关于价值的东西alignof(T)
在标准中,而不是它不超过alignof(std::max_align_t)
.
对齐是2的幂并不明显。为什么对齐不是3?
该标准对该语言有最终决定权,因此这里引用了该部分的内容。我将 2 的幂要求加粗:
3.11 对齐[basic.align]
1 对象类型具有对齐要求(3.9.1、3.9.2),该要求对该类型的对象可以分配的地址施加限制。对齐是一个实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数。对象类型对该类型的每个对象施加对齐要求;可以使用对齐说明符 (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)。具有扩展对齐要求的类型是过度对齐类型。[ Note:每个过度对齐类型都是或包含应用扩展对齐的类类型(可能通过非静态数据成员)。——尾注]
4 对齐方式表示为类型的值std::size_t
。有效对齐仅包括基本类型的alignof表达式返回的值以及附加的实现定义的值集(可能为空)。每个对齐值应为 2 的非负整数幂。
5 阵营有从弱到强或更严格的阵营顺序。更严格的对齐具有更大的对齐值。满足对齐要求的地址也满足任何较弱的有效对齐要求。
为什么所有实现都符合该要求(这就是它可以被包含在内的部分原因)?
嗯,因为在 2 中乘法/除法/屏蔽 2 的幂是很自然的binary,所有系统(不包括一些非常古老的系统)过去、现在、并且在可预见的未来将继续存在本质上是二元的.
自然意味着它比任何其他乘法/除法/模算术更有效,有时甚至高出几个数量级。
As @MooingDuck 指出 /questions/24788262/why-alignment-is-power-of-2#comment38472446_24788755,计算平台的这种基本的二进制性质已经渗透到语言及其标准中,达到这样的程度,尝试构建一个非二进制一致的实现与解开棘手的结而不只是切断它是一样的。确实很少有计算机语言不是这样的。
另请参阅维基百科上的字大小表 //en.wikipedia.org/wiki/Word_(computer_architecture)#Table_of_word_sizes以供佐证。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)