2 Stimmen

Wird Assembler-Code für den Standard-Konstruktor in C++ erstellt?

Wenn ich in einer Klasse in C++ keinen Standardkonstruktor oder andere Konstruktoren definiere, habe ich gelesen, dass der Compiler einen Standardkonstruktor für Sie erstellt. Aber ich habe eine Testklasse erstellt, sie zu Assemblercode kompiliert und überprüft, dass nichts dergleichen erstellt wird.
Kann jemand klären, wie der Code für den Standardkonstruktor erstellt wird, oder ob er überhaupt erstellt wird?

6voto

Erik Punkte 85308

Standard-Konstruktor wird erstellt wenn Sie es brauchen z.B:

class Foo {
  std::string s;
};

...
Foo f;

12.1:

Der Standardkonstruktor (12.1), der Kopierkonstruktor Konstruktor und Kopierzuweisungs Operator (12.8), und Destruktor (12.4) sind spezielle Mitgliedsfunktionen. Die Implementierung wird implizit deklariert diese Mitgliedsfunktionen für eine Klasse Typ implizit deklariert, wenn das Programm sie nicht sie nicht explizit deklariert, außer wie wie in 12.1 beschrieben. Die Implementierung wird sie implizit definieren, wenn sie verwendet werden, wie in 12.1, 12.4 und 12.8.

Wenn Ihre Klasse keine Anforderungen an den Konstruktor stellt, kann es sein, dass ein Compiler den Code nicht erzeugt, obwohl der Konstruktor laut Standard vorhanden sein sollte.

2voto

GManNickG Punkte 476445

C++ != Assembly.

Assembly ist (eine mögliche) Ausgabe für ein kompiliertes C++-Programm, das bestimmte Optimierungen enthalten kann oder auch nicht, die den Aufruf eines möglicherweise leeren Konstruktors vermieden haben könnten.

Mit anderen Worten: Die Sprache sagt zwar, dass es einen Standardkonstruktor gibt, aber er beschreibt nur das Verhalten, nicht die Implementierung. Wenn eine Implementierung der Meinung ist, dass sie keinen Code generieren muss, dann muss sie das auch nicht.

2voto

ildjarn Punkte 61204

So steht es in der Norm C++03:

§12.1/5:

Ein Standardkonstruktor für eine Klasse X ist ein Konstruktor der Klasse X, der ohne ein Argument aufgerufen werden kann. Wenn es keinen vom Benutzer deklarierten Konstruktor für die Klasse X gibt, wird ein Standardkonstruktor implizit deklariert. Ein implizit deklarierter Standardkonstruktor ist ein öffentliches Inline-Mitglied seiner Klasse. Ein Konstruktor ist trivial, wenn er ein implizit deklarierter Standardkonstruktor ist und wenn:

  • ihre Klasse hat keine virtuellen Funktionen (10.3) und keine virtuellen Basisklassen (10.1), und
  • alle direkten Basisklassen ihrer Klasse triviale Konstruktoren haben und
  • für alle nichtstatischen Datenelemente ihrer Klasse, die vom Typ Klasse (oder Array davon) sind, hat jede solche Klasse einen trivialen Konstruktor.

§12.1/6:

Andernfalls ist der Konstruktor nicht trivial.

§12.1/7:

Ein implizit deklarierter Standardkonstruktor für eine Klasse ist implizit definiert, wenn er verwendet wird, um ein Objekt seines Klassentyps zu erzeugen (1.8). Der implizit definierte Standardkonstruktor führt die Menge der Initialisierungen der Klasse durch, die von einem benutzerdefinierten Standardkonstruktor für diese Klasse mit einer leeren mem-initializer-list (12.6.2) und einem leeren Funktionskörper durchgeführt werden würde. Wenn dieser vom Benutzer geschriebene Standardkonstruktor schlecht geformt wäre, ist das Programm schlecht geformt. Bevor der implizit deklarierte Standardkonstruktor für eine Klasse implizit definiert wird, müssen alle implizit deklarierten Standardkonstruktoren für ihre Basisklassen und ihre nichtstatischen Datenelemente implizit definiert worden sein. [Anmerkung: Ein implizit deklarierter Standardkonstruktor hat eine Ausnahmespezifikation (15.4).


Dies hat zur Folge, dass für Klassen mit implizit deklarierten aber nicht implizit definiert Standardkonstruktoren, oder für Klassen mit implizit definierten trivial Standardkonstruktoren, ist möglicherweise keine Codegenerierung erforderlich.

1voto

Gunther Piez Punkte 28746

Wollten Sie fragen, ob Ihr Compiler tatsächlich Code für einen Standardkonstruktor ausgibt?

Das hängt von der Optimierung ab. Die meisten modernen Compiler geben die Standard-Konstruktor-Codesequenz aus, wenn sie mit -O0 verwendet wird, optimieren sie aber weg, wenn sie unbenutzt ist und Sie -O2 oder höher verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X