该标准对未对齐的内存访问有何说法?

时间:2018-07-01 19:13:27

标签: c++ language-lawyer c++17 memory-alignment

我已经搜索了有关不对齐访问的标准,但没有发现任何内容(也许我是无意的)。

这是未定义的行为吗?实现定义了吗?

由于许多当前的CPU支持未对齐访问,因此明智的做法是定义未实现的内存访问。是这样吗?

通过不对齐访问,例如:

alignas(int) char buffer[sizeof(int)+1];
int &x = *new(buffer+1) int;
x = 42;

1 个答案:

答案 0 :(得分:21)

不,是UB。您无法在未对齐的内存中开始对象的生存期。来自[basic.life]p1

  

T 类型的对象的生存期始于以下时间:

     
      获得具有 T 类型的正确对齐方式和大小的
  • 存储,并且

  •   
  • 如果对象具有非空初始化,则其初始化完成,

  •   
     

[...]

因此,在您的示例中,x引用的对象的生存期甚至还没有开始,因此除[basic.life]p6中提到的以外,该对象的其他用法都是UB。

但是您的实现被允许做的是说未对齐的内存(由所使用的基础体系结构指定)实际上是对齐的,从而使您的代码在C ++抽象机下有效。我不确定是否有任何编译器会这样做。