Gibt es eine Möglichkeit, die Standardfunktionen (z. B. Standardkopiekonstruktor, Standardzuweisungsoperator) anzuzeigen, die von einem Compiler wie VC ++ 2008 für eine Klasse generiert wurden, die sie nicht definiert?
Mit dem clang
-Compiler können Sie sie sehen, indem Sie das Argument -ast-dump
übergeben. Clang ist noch in der Entwicklungsphase, aber Sie können es bereits für diese Dinge verwenden:
Ich hoffe, Sie haben danach gefragt. Lassen Sie uns den Code ändern und erneut schauen.
%Vor% Beachten Sie, dass der implizit deklarierte Copy-Konstruktor von A
jetzt einen nichtkonstanten Referenzparameter hat, weil eines seiner Member ebenfalls (member m
) hat und dass M
keinen Standardkonstruktor deklariert hat.
Um den generierten Code zu erhalten, können Sie die Zwischensprache der virtuellen Maschine ausgeben lassen. Schauen wir uns den generierten Code an:
%Vor%Nun verstehe ich diese Zwischensprache nicht (die auf llvm.org definiert ist). Aber Sie können all diesen Code mithilfe des llvm-Compilers in C übersetzen:
%Vor%Tada! Beachten Sie, wie der virtuelle Tabellenzeiger im Kopierkonstruktor und im Standardkonstruktor festgelegt wird. Hoffe das hilft.
Sie können den Code mit dem Debugger verfolgen, um zu sehen, was passiert. Zum Beispiel:
%Vor%Setzen Sie einen Haltepunkt bei der Konstruktion von 'b' durch den Kopierkonstruktor. Die Assembler-Ausgabe an diesem Punkt im VC ++ 6-Debugger lautet:
%Vor%Der letzte ist der Aufruf des Kopierkonstruktors. Das können Sie auch nachvollziehen, wenn Sie mehr Details wünschen.
Wenn Ihre Frage jedoch lautet: "Wie kann ich den C ++ - Code für den Kopierkonstruktor sehen?" Die Antwort lautet: Sie können nicht, weil es keinen gibt - der Compiler generiert Assembler- oder Maschinencode (abhängig von Ihr Compiler) für sie, nicht C ++ - Code. Die vom Compiler generierten Methoden sind abstrakt und im Quellcode nicht vorhanden.
Schauen Sie sich das Beispiel unten an und ich versuche zu erklären, was die vier vom Compiler generierten Methoden auf Quellcodeebene tun sollen. Daraus sollten Sie in der Lage sein, jede normale Klasse zu extrapolieren.
Wenn Sie eine Klasse wie diese haben:
%Vor%Dann generiert der Compiler das Äquivalent zu folgendem:
%Vor%Sind Sie sicher, dass Sie diese Funktionen anzeigen müssen?
Standardmäßig erstellt der Compiler sie, indem er den Operator "Konstruktor kopieren" oder "Zuweisung" für jede Elementvariable aufruft.
Das Problem dabei ist, dass wenn Sie Objekte verwenden, die das Referenzzählen zum Verwalten von Daten verwenden, der Standard-Kopierkonstruktor eine Kopie des Objekts erstellen wird, aber keine Kopie der Daten, auf die das Objekt zeigt. Dies gilt auch für Zeiger. Also, wenn Sie eine Klasse wie:
haben %Vor%Der Standard-Copy-Konstruktor kopiert nur die Daten a und den Zeiger b. Er kopiert jedoch nicht die Daten, auf die mit b verwiesen wird. Wenn Sie diese Klasse wie
verwenden %Vor%Wenn Sie möchten, dass diese Klasse den Wert von Ptwo anstelle des Zeigers kopiert, benötigen Sie eine eigene Kopierzuweisungsoperatorfunktion. Wenn Sie sich für mehr Details interessieren, was die Standardfunktionen tun und was nicht, dann werfen Sie einen Blick in das Buch "Effective C ++" Es hat ein ganzes Kapitel zu diesem Thema, das erklärt, was Standardfunktionen von Klassen tun, nicht tun, was sie tun sollten, wann sie selbst schreiben sollten. Ich bin sicher, dass Sie eine digitale Version im Internet erhalten können, wenn Sie nur über diese Funktionalität wissen möchten.
Tags und Links c++ visual-c++