メモリ ロンダリング: 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
Other Applications
std::launder は、新しいオブジェクトをメモリに割り当てる場合など、ライフタイムが違反される可能性がある状況でも使用できます。配置を使用せずに古いオブジェクトを保存する new:
alignas(int) char data[sizeof(int)]; new(&data) int; int *p = std::launder(reinterpret_cast<int*>(&data));
ポインタをロンダリングすることで、ライフタイム ルールをバイパスしますそうしないと、新しいオブジェクトにアクセスできなくなります。
以上がC の `std::launder` はメモリのエイリアシングと寿命の問題をどのように解決しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。