【发布时间】:2013-03-27 20:29:51
【问题描述】:
我正在阅读 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 从内存中获取和写入数据的最佳方式。
据我了解,这种严格的对齐方式可能会毁掉它。我错了吗?什么是严格对齐与弱对齐?
【问题讨论】:
标签: c++ c++11 alignment strict