代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

C++对齐-严格和弱

  •  11
  • Tony The Lion  · 技术社区  · 11 年前

    我正在阅读N3485 C++标准草案,在关于对齐的部分中,它说明了以下内容:

    3.11对齐[基本对齐]

    1. 对齐是一个实现定义的整数值,表示 给定对象可以被分配的连续地址之间的字节数。对象类型将对齐要求强加给该类型的每个对象; 可以使用对齐说明符请求更严格的对齐 (7.6.2).

    在这里,它说明了什么是对齐,我明白了。这意味着,如果您有32位(4字节)系统,它将一次读取4字节大小的块,所以您应该将内容放在内存中的4字节偏移地址处。很多这些都是由一个好的编译器处理的,然而C++也让你在其中有发言权。

    它所说的对齐说明符是 alignas .

    您可以将整数传递给 阿利纳斯 指定对齐要求或类似类型 alignas(double)

    现在,您有弱对齐或严格对齐,声明如下:

    5路线的订单来自 弱到强或更严格 路线。 越严格的路线值越大。 一 满足对齐要求的地址也满足任何 较弱的有效对准要求。

    7比较路线是有意义的,并提供了明显的结果:

    当两条路线的数值相等时,它们是相等的。

    当两条路线的数值不相等时,它们是不同的。

    当一条路线比另一条路线大时,表示路线更严格。

    因此,这里它指出,更严格的对齐就是更大的对齐。这只是意味着 alignas(8) alignas(4) ? 在32位(4字节)系统上,8版本意味着 int 类型将需要两次读取而不是一次,并且一次只需要填充。严格的指的是这样一个事实吗?当对齐被“滥用”时,它会给CPU带来潜在的开销,就像这个愚蠢的例子一样?

    我意识到,并不是所有的对齐在给定的系统上都是有效的,扩展的对齐必须是有效的才能产生正确的行为。

    对我来说,对齐是让CPU以字大小的块访问内存数据,这是CPU向内存获取数据和向内存写入数据的最佳方式。

    据我所知,这种严格的结盟可能会破坏这一点。我错了吗?什么是严格对齐与弱对齐?

    1 回复  |  直到 11 年前
        1
  •  8
  •   R. Martinho Fernandes    11 年前

    “严格”只是指这样一个事实,即较大的对齐值在可能的地址方面更具限制性。

    对齐8的有效地址只有对齐4的一半,因此具有对齐8的类型在放置位置方面受到更多限制。