我在哪里可以找到std :: launder真正做的事情?

alf*_*lfC -2 c++ pointer-aliasing reinterpret-cast c++17

我试图理解它是std::launder做什么的,我希望通过查找一个示例实现,它将是清楚的.

我在哪里可以找到一个示例实现std::launder

当我查看lbic ++时,我看到了类似的代码

  template<typename _Tp>
    [[nodiscard]] constexpr _Tp*
    launder(_Tp* __p) noexcept
    { return __builtin_launder(__p); }
Run Code Online (Sandbox Code Playgroud)

这让我觉得这是另一个编译魔术函数.

这个函数__builtin_launder可能会做什么,它是否只是添加一个标记来抑制编译器有关别名的警告?

是否可以理解std::launder来讲__builtin_launder,或者它只是更多的编译器魔术(挂钩)?

Yak*_*ont 9

目的std::launder不是"抑制警告",而是删除C++编译器可能具有的假设.

别名警告试图通知您,您可能正在执行其行为未由C++标准定义的事物.

编译器可以并且确实假设您的代码只执行标准定义的事情.例如,它可以假定const一旦构造的值的指针将不会改变.

编译器可以使用该假设跳过从内存中重新获取值(并将其存储在寄存器中),或者甚至在编译时计算其值并根据它执行死代码消除.它可以假设这一点,因为任何错误的程序都在执行未定义的行为,因此在C++标准下接受任何程序行为.

std::launder被雕琢,允许你把一个指向真正const的是在法律上修改后的值(通过创建在其存储一个新的对象,说的),并使用该指针之后以确定的方式修改(所以它指的是新的对象)和其他特定和类似的情况(不要假设它只是"消除别名问题"). __builtin_launder从某种意义上讲,它将成为一种"noop"函数,但在另一种意义上,它将改变围绕它生成什么样的汇编代码.有了它,关于其输出可以达到什么价值的某些假设是不可能的.并且输入指针上的某些UB代码不是输出指针上的UB.

这是一个专家工具.我个人不会在没有进行大量标准钻研和双重检查的情况下使用它,因为我没有使用它.之所以添加它,是因为某些操作被某人证明无法以标准兼容的方式合理地执行,并且它允许库编写者现在有效地执行它.