std :: launder的目的是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (21)

P0137引入了函数模板std :: launder,并在关于联合,生命期和指针的章节中对标准进行了许多更改。 它正在解决什么问题? 我必须注意的语言有哪些变化?

提问于
用户回答回答于

std::launder,它执行内存清洗.

考虑一下文件中的例子:

struct X { const int n; };
union U { X x; float f; };
...

U u = {{ 1 }};

语句执行聚合初始化,初始化U带着{1}.

因为nconst变量时,编译器可以自由地假设u.x.n是1。

我们必须洗刷我们的记忆:

assert(*std::launder(&u.x.n) == 2); //Will be true.

内存清洗用于防止编译器从跟踪对象的位置,从而迫使它避免任何可能不再适用的优化。

另一个不合格的因素是如果更改对象的类型。std::launder在这里也能有所帮助:

aligned_storage<sizeof(int), alignof(int)>::type data;
new(&data) int;
int *p = std::launder(reinterpret_cast<int*>(&data));

所属标签

可能回答问题的人

  • 红双喜经典VS中华

    1 粉丝0 提问8 回答
  • 杰西

    5 粉丝1 提问4 回答
  • 浮生长恨欢娱少

    个人站长 · 站长 (已认证)

    51 粉丝2 提问4 回答
  • 滑稽园扛把子

    Swoole Inc · PHP工程师 (已认证)

    135 粉丝0 提问4 回答

扫码关注云+社区