std :: launder的目的是什么?

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

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

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));

扫码关注云+社区