为什么对齐是2的幂?

St.*_*rio 9 c++ memory-alignment

cppreference有一个引用:

每个对象类型都有称为对齐要求的属性,它是一个整数值(类型为std :: size_t,总是2的幂),表示可以分配此类对象的连续地址之间的字节数.

据我所知,这个参考文献是非规范性的.但是alignof(T)标准中没有关于价值的东西,而不是它alignof(std::max_align_t).

显然,对齐是2的幂.为什么对齐不是3?

Ded*_*tor 8

标准对语言有最后的说法,所以这里引用该部分.我加强了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; }
Run Code Online (Sandbox Code Playgroud)

当D是一个完整对象的类型时,它将有一个B类型的子对象,因此它必须适当地对齐一个long double.如果D显示为另一个也具有B作为虚拟基类的对象的子对象,则B子对象可能是不同子对象的一部分,从而降低了对D子对象的对齐要求.-end example] alignof运算符的结果反映了完整对象案例中类型的对齐要求.
3扩展对齐由大于alignof(std :: max_align_t)的对齐表示.它是实现定义的,是否支持任何扩展对齐以及支持它们的上下文(7.6.2).具有扩展对齐要求的类型是过度对齐类型.[注意:每个过度对齐的类型都是或包含应用扩展对齐的类类型(可能通过非静态数据成员).-end note]
4对齐表示为类型的值std::size_t.有效对齐仅包括由基本类型的alignof表达式返回的值以及可能为空的其他实现定义的值集.每个对齐值应为2的非负整数幂.
5对齐有从弱到强或更严格的对齐的顺序.更严格的对齐具有更大的对齐值.满足对齐要求的地址也满足任何较弱的有效对齐要求.

为什么所有实现都符合该要求(这是它可以被包含的部分原因)?

好吧,因为在二进制中乘以/除以/掩盖2的幂是很自然的,并且所有系统都是(不包括一些非常古老的系统),并且在可预见的未来将基本上保持二进制.
自然意味着它比任何其他乘法/除法/模运算更有效,有时是数量级.

正如@MooingDuck指出的那样,计算平台的这种基本二进制本质已经在语言及其标准中渗透到如此程度,试图建立一个非二进制符合的实现与解开gordian结而不仅仅是削减它是相似的.实际上很少有计算机语言,这是不正确的.

相关的,维基百科上的字大小表:http://en.wikipedia.org/wiki/Word_ ( computer_architecture)#Table_of_word_sizes