我正在阅读 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 从内存中获取和写入数据的最佳方式。
据我了解,这种严格的对齐方式可能会毁掉它。我错了吗?什么是严格对齐与弱对齐?