Optimierung des Kopierkonstruktors in C
In C kann der Kopierkonstruktor unter bestimmten Umständen möglicherweise nicht aufgerufen werden, was Fragen zur Compileroptimierung aufwirft die undokumentierten Funktionen der Sprache.
Bedenken Sie Folgendes Code:
class A { public: A(int value) : value_(value) { cout << "Regular constructor" << endl; } A(const A& other) : value_(other.value_) { cout << "Copy constructor" << endl; } private: int value_; }; int main() { A a = A(5); }
Man würde erwarten, dass die Ausgabe sowohl „Regulärer Konstruktor“- als auch „Konstruktor kopieren“-Nachrichten enthält. Allerdings wird in diesem Fall der Kopierkonstruktor nie aufgerufen.
Dieses Verhalten ist weder eine Compileroptimierung noch eine undokumentierte Funktion von C . Stattdessen ist im C-Standard (§12.8.15) explizit festgelegt, dass Zuweisungen wie T = x; kann als T(x); interpretiert werden, wodurch das innere T effektiv eliminiert wird, wenn keine Kopie erforderlich ist.
In diesem speziellen Fall erkennt der Compiler, dass das Erstellen eines A-Objekts und das anschließende Kopieren desselben überflüssig ist und lässt daher den Aufruf des Kopierkonstruktors aus.
Um den Aufruf des Kopierkonstruktors zu erzwingen, kann man explizit das erste A-Objekt erstellen:
A a; // Construct an empty A object a = A(5); // Copy-initialize it with another A object
Das obige ist der detaillierte Inhalt vonWann überspringt C den Kopierkonstruktor?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!