Reinterpret_cast und triviale Standardkonstruktoren: Eine Reise in undefiniertes Verhalten
In der cppreference-Dokumentation wurde einmal behauptet, dass triviale standardmäßig konstruierbare Objekte mit erstellt werden könnten reinterpret_cast auf entsprechend ausgerichtetem Speicher. Diese Behauptung wurde jedoch inzwischen überarbeitet, um die Notwendigkeit der Verwendung von „placement-new“ zur expliziten Initialisierung solcher Objekte hervorzuheben.
Das Geheimnis der Lebenszeit
Wenn reinterpret_cast Objekte erstellt hat , stünden wir vor einem Dilemma hinsichtlich ihrer Lebensdauer. Würde der Gießvorgang selbst den Beginn des Objekts markieren? Oder würde es früher auftreten, wenn der Speicher mit einem Ausdruck wie alignas(X) char buffer[sizeof(X)] zugewiesen wurde?
Im letzteren Fall ergibt sich die interessante Möglichkeit, dass eine bedingte Anweisung zwischen Speicher Zuweisung und Umwandlung könnten möglicherweise entweder ein X-Objekt oder eine andere trivial standardmäßig konstruierbare Entität, Y, konstruieren.
Die klärende Anleitung des Standard
Leider schließt der C-Standard eine solche amorphe Objekterstellung explizit aus. Gemäß [intro.object]/1 können Objekte nur durch eine Definition, einen neuen Ausdruck, die Aktivierung des aktiven Mitglieds einer Union oder die Erstellung eines temporären Objekts entstehen.
Nicht einmal eine leere Existenz
Die Vorstellung einer leeren Initialisierungslebensdauer ist für diese Situation irrelevant. Damit dieses Konzept anwendbar ist, muss zunächst ein Objekt existieren, was hier nicht der Fall ist.
Konsequent undefiniert
Während der gesamten Geschichte von C ist das Verhalten von reinterpret_casting trivial Standardmäßig konstruierbare Objekte sind durchweg undefiniert geblieben. Sowohl C 11 als auch C 1z folgen dem Grundprinzip, dass unterschiedliche Objekte unterschiedliche Adressen haben müssen, was die Erstellung mehrerer Objekte innerhalb desselben Speichers zu einem Schrödingers katzenartigen Paradoxon macht.
Schlussfolgerung
Die reinterpret_cast-Operation ist kein magisches Werkzeug zum Erstellen von Objekten. Beim Versuch, seine kreativen Kräfte zu nutzen, riskieren Programmierer, undefiniertes Verhalten hervorzurufen und ihren Code in die tückischen Tiefen der Unvorhersehbarkeit zu stürzen.
Das obige ist der detaillierte Inhalt vonWann erstellt „reinterpret_cast' tatsächlich Objekte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!