c++对齐-严格和弱

C++ alignment - strict and weak

本文关键字:对齐 c++      更新时间:2023-10-16

我正在阅读N3485 c++标准草案,在对齐部分,它陈述如下:

3.11 align [align]

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

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

它所说的对齐指示符是alignas

您可以将一个整数传递给alignas来指定您的对齐要求,或者像alignas(double)这样的类型

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

5排列顺序从弱到强或更严格比对。严格对齐有更大的对齐值。满足对齐要求的地址也满足任何较弱的有效对齐要求。

7比较排列是有意义的,并且提供了明显的结果:

-当两个对齐的数值相等时,它们相等。

-当数值不相等时,两个对齐方式是不同的。

- 当一种对齐方式比另一种更大时,它表示更严格的对齐。

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

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

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

按照我的理解,这种严格的对齐可能会破坏它。我错了吗?什么是严格对齐与弱对齐?

这里的"strict"仅仅是指更大的对齐值在可能的地址方面有更多的限制。

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