11

我正在阅读 N3485 C++ 标准草案,在对齐部分中,它指出以下内容:

3.11 对齐[basic.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 从内存中获取和写入数据的最佳方式。

据我了解,这种严格的对齐方式可能会毁掉它。我错了吗?什么是严格对齐与弱对齐?

4

1 回答 1

8

“严格”仅指更大的对齐值在可能的地址方面更具限制性的事实。

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

于 2013-04-05T12:47:24.013 回答