gpt4 book ai didi

c++ - ABI 规范中的内存布局是否仅适用于 ABI 边界?

转载 作者:行者123 更新时间:2023-12-01 13:09:08 26 4
gpt4 key购买 nike

ABI 标准中与内存布局相关的规范是否通常仅适用于 ABI 边界,或者也适用于例如在翻译单元中,或者如果不是这种情况,编译器通常会做出这样的额外保证吗?

如果“一般”太宽泛,请考虑例如带有 System V x64 和 Itanium C++ ABI 的 GCC/Clang。

这里有两个例子来说明我的意思:

  • System V x64 ABI 指定大小至少为 16 字节的数组具有至少 16 字节的对齐方式,即使元素类型的对齐方式较小,因此对齐方式比 alignof 更严格。会建议。它还指定了 long double 的对齐方式是 16 .如果调用以下在 C++ 标准下具有未定义行为的函数也是如此,即使 storage 也可以在 System V x86 ABI 下安全使用数组永远不会跨越翻译单元边界暴露?
    void f() {
    char storage[16]; // Only guaranteed to have alignment `1` by the C++ standard.
    using T = long double;
    auto p = new(storage) T;
    }
  • Itanium C++ ABI 指定了类的布局。例如:
    #include<new>

    struct A {
    int i;
    virtual ~A() {}
    };

    struct B : A {
    int j;
    };

    void f() {
    B b;
    std::launder(reinterpret_cast<A*>(&b))->i = 1;
    }
    f当被调用时在 C++ 标准下具有未定义的行为,因为 BA不是标准布局,因此未指定 A子对象位于与 b 相同的地址,这会导致 std::launder 上的未定义行为如果没有。然而,在 Itanium C++ ABI 下,保证 A子对象的地址与 b 相同因此 std::launder将会成功。因此,在 Itanium C++ ABI 下,即使 b 也是安全的吗?永远不会越过翻译单元边界?

  • 我假设我的两个示例都是安全的,但是这是在引用标准中还是在编译器的策略中指定的?

    最佳答案

    是的,根据我的阅读,这两个实例都是安全的。

    我无法向您指出 Itanium C++ ABI 的某个部分,但无论如何您似乎对它所说的内容很坚定。

    但我知道:

    根据 C++ 标准未定义的行为的一种可能表现是语言的某些实现,例如 Itanium C++ ABI,保证该构造的特定行为。

    也就是说,如果一个标准说“这没有定义”,而另一个标准说“这被定义为做 Y”,那么,如果您的实现符合这两个标准,您应该能够假设“Y”发生了。

    (旁注:另一方面,如果一个标准说“这被定义为执行 X”,而另一个标准说“这被定义为执行 Y”,那么,如果“X”!=“Y”,则您的实现不能符合两个标准。)

    关于c++ - ABI 规范中的内存布局是否仅适用于 ABI 边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60944108/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com