代码之家  ›  专栏  ›  技术社区  ›  geza

标准对未对齐的内存访问有何规定?

  •  23
  • geza  · 技术社区  · 7 年前

    我已经搜索了有关未对齐访问的标准,但没有找到任何内容(可能是我无意中发现的)。

    是不明确的行为吗?是否定义了IT实现?

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

    我指的是未对齐的访问,例如:

    alignas(int) char buffer[sizeof(int)+1];
    int &x = *new(buffer+1) int;
    x = 42;
    
    1 回复  |  直到 7 年前
        1
  •  21
  •   Rakete1111    7 年前

    不,是UB。不能在未对齐的内存中启动对象的生存期。从 [basic.life]p1

    类型对象的生存期 T型 开始时间:

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

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

    […]

    所以在您的示例中,引用的对象的生存期 x 甚至都没有开始,所以除了在 [basic.life]p6 是UB。

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