Heim >Backend-Entwicklung >C++ >Wie löst „std::launder' von C Speicheraliasing- und Lebensdauerprobleme?
Speicherwäsche: Die Einführung von std::launder in C
P0137 führt std::launder ein, um bestimmte Probleme im Zusammenhang mit Gewerkschaften anzugehen, Lebensdauer und Zeiger in C . Diese Funktionsvorlage ermöglicht Speicherwäsche, einen Prozess, der verhindert, dass der Compiler Annahmen über den geänderten Speicherinhalt trifft.
Speicherwäsche
std::launder führt Speicher durch Geldwäsche, die alle Annahmen, die der Compiler möglicherweise über den Inhalt eines Speicherorts getroffen hat, beseitigt. Dies ist besonders relevant, wenn:
Beispiel: Waschen einer const Union Feld
Betrachten Sie dieses Beispiel:
struct X { const int n; }; union U { X x; float f; }; U u = {{ 1 }}; X *p = new (&u.x) X {2};
Beim Initialisieren von u.x mit {1} wird davon ausgegangen, dass das const-Mitglied n immer 1 ist. Allerdings wird p einem neuen X-Objekt mit n zugewiesen Auf 2 gesetzt verstößt gegen diese Annahme.
Um nach dieser Änderung korrekt auf u.x.n zugreifen zu können, müssen wir das waschen Memory:
assert(*std::launder(&u.x.n) == 2); // Will be true
Andere Anwendungen
std::launder kann auch in Situationen verwendet werden, in denen Lebensdauern möglicherweise verletzt werden, beispielsweise beim Zuweisen eines neuen Objekts im Speicherung eines alten Objekts ohne Platzierung neu:
alignas(int) char data[sizeof(int)]; new(&data) int; int *p = std::launder(reinterpret_cast<int*>(&data));
Durch das Waschen des Zeigers umgehen wir die Lebenszeitregeln, die sonst verhindern würden Zugriff auf das neue Objekt.
Das obige ist der detaillierte Inhalt vonWie löst „std::launder' von C Speicheraliasing- und Lebensdauerprobleme?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!