内存清洗:C 语言中 std::launder 的介绍
P0137 引入 std::launder 来解决与联合相关的某些问题,生命周期和 C 中的指针。此函数模板允许进行内存清洗,该过程可防止编译器对内存的修改内容做出假设。
内存清洗
std::launder 执行内存洗钱,它消除了编译器可能对内存位置的内容所做的任何假设。这在以下情况下尤其重要:
示例:洗钱 const Union字段
考虑这个示例:
struct X { const int n; }; union U { X x; float f; }; U u = {{ 1 }}; X *p = new (&u.x) X {2};
用 {1} 初始化 u.x 假定 const 成员 n 始终为 1。但是,将 p 分配给带有 n 的新 X 对象设置为 2 违反了这个假设。
为了在修改后正确访问 u.x.n,我们必须清洗memory:
assert(*std::launder(&u.x.n) == 2); // Will be true
其他应用程序
std::launder 也可以在可能违反生命周期的情况下使用,例如在内存中分配新对象时不使用新放置的情况下存储旧对象:
alignas(int) char data[sizeof(int)]; new(&data) int; int *p = std::launder(reinterpret_cast<int*>(&data));
通过清洗指针,我们绕过了生命周期规则否则将阻止访问新对象。
以上是C 的 `std::launder` 如何解决内存别名和生命周期问题?的详细内容。更多信息请关注PHP中文网其他相关文章!