【问题标题】:C++ alignment - strict and weakC++ 对齐 - 严格和弱
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-09-20
      • 2021-12-04
      • 2012-11-08
      • 2012-12-19
      • 1970-01-01
      • 2010-11-02
      • 2012-11-14
      • 2013-02-14
      • 2010-11-20
      相关资源
      最近更新 更多