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

gez*_*eza 23 c++ memory-alignment language-lawyer c++17

我搜索了关于未对齐访问的标准,但没有找到任何东西(也许我是无意的).

是不确定的行为?它是实现定义的吗?

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

通过未对齐访问,我的意思是例如:

alignas(int) char buffer[sizeof(int)+1];
int &x = *new(buffer+1) int;
x = 42;
Run Code Online (Sandbox Code Playgroud)

Rak*_*111 21

不,是UB.您无法在未对齐的内存中启动对象的生命周期.来自[basic.life] p1

类型T对象的生命周期始于:

  • 获得具有适当对齐和T型尺寸的存储,并且

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

[...]

所以在你的例子中,引用的对象的生命周期x甚至都没有开始,所以除了[basic.life] p6中提到的其他任何用法都是UB.

但是你的实现允许做的是说未对齐的内存(由所使用的底层架构指定)实际上是对齐的,从而使你的代码在C++抽象机器下有效.我不确定是否有任何编译器这样做.

  • @MaximEgorushkin无论编译器开发人员决定它应该返回什么.它可以返回"1",或者它可以(在我的GCC上)返回"4".如果硬件允许带有性能开销的错位访问,则实现仍然可以返回"4"以使(大多数)整数对齐,从而提高性能. (2认同)
  • @MaximEgorushkin这可能是`alignof`返回的对齐方式. (2认同)
  • @geza这是明确的.抽象机器不关心底层HW的对齐.如果编译器说内存是未对齐的,那么无论硬件是什么,你都会获得UB. (2认同)
  • @geza 我理解为“正确”,这就是 alignof 返回的内容。它可以改进,我同意。 (2认同)