为什么对齐是2的幂?

时间:2014-07-16 18:39:14

标签: c++ memory-alignment

引用cppreference

  

每个对象类型都有一个名为alignment requirement的属性   是一个整数值(类型为std :: size_t,总是2的幂)   表示连续地址之间的字节数   可以分配这种类型的对象。

据我所知,这个引用是非规范性的。但标准中没有关于alignof(T)的价值的内容,而不是alignof(std::max_align_t)

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

2 个答案:

答案 0 :(得分:7)

标准有该语言的最后一个词,所以这里引用该部分。我加强了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类型的子对象,因此必须对齐   适当的长期双倍。如果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的幂是很自然的,并且所有系统都是(不包括一些非常古老的系统),并且在可预见的将来会保持< strong>从根本上说二进制。
自然意味着它比任何其他乘法/除法/模运算更有效,有时甚至是数量级。

正如@MooingDuck指出的那样,计算平台的这种基本二进制特性已经遍及语言及其标准到这种程度,试图构建一个非二进制符合的实现与解开gordian相当。结,而不只是切割它。实际上很少有计算机语言不适用。

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

答案 1 :(得分:4)

计算机的构建方式。

计算机有一个自然的单词&#39;尺寸比其他尺寸更容易处理。在64位CPU上,大小为8字节。以8字节操作是最有效的。硬件的构建方式是获取与此字大小对齐的内存也更有效。因此,对齐通常基于CPU的字大小。

单词大小是2的幂,因为这又是计算机的构建方式。一切都归结为位 - 一个字中的位数也是如此。设计硬件更容易,其中一个字的位数本身就是2的幂。