Sind der Standardkonstruktor und der Destruktor immer inline?

7

Ich bin neugierig, ob der Standardkonstruktor und der Destruktor, den der Compiler erzeugt, inline sind oder nicht, weil ich das auf jede Art und Weise begründen kann. Auf der einen Seite soll der Standardkonstruktor / -destruktor nicht inline sein, damit das Hinzufügen von ihnen später ABI nicht unterbricht (weil Objektdateien, die kompiliert wurden, wenn nur die Standardwerte vorhanden waren, die generierten Definitionen inline haben) anstatt was du definierst). Auf der anderen Seite kann ein C ++ - Compiler zum Kompilieren von C-Code, der so gut funktioniert, wie wenn er mit einem C-Compiler kompiliert wird, keine Konstruktor- / Destruktoraufrufe für jede zugeordnete Struktur und in C ++ den einzigen funktionalen Unterschied zwischen einer Klasse hinzufügen und eine Struktur soll der Standardzugriffsschutz sein. Vielleicht adressiert der Linker das irgendwie? Vielleicht variiert die Antwort zwischen den Compilern?

Eine Konsequenz dieser Frage: Wenn ich eine POD-Struktur in C ++ habe, kann ich theoretisch unter einigen Compilern profitieren, indem ich leere Inline-Konstruktoren / Destruktoren selbst anstelle der Standardwerte definiere?

    
Joseph Garvin 08.06.2011, 03:41
quelle

3 Antworten

16

Der C ++ - Standard sagt in 12.1 [class.ctor] / 5

  

Ein implizit deklarierter Standardkonstruktor ist ein öffentliches Inline-Mitglied seiner Klasse

und in 12.4 [class.dtor] / 3

  

Implizit deklariert   Destruktor ist ein öffentliches Inline-Mitglied seiner Klasse.

    
Cubbi 08.06.2011, 03:51
quelle
3
  

Wenn ich eine POD-Struktur in C ++ habe, kann ich theoretisch unter einigen Compilern profitieren, indem ich selbst leere Inline-Konstruktoren / -Destruktoren anstelle der Standardwerte definiere?

Theoretisch, ja! Jede Funktion (einschließlich Konstruktoren und Destruktoren) kann inline deklariert werden, und das Einfügen des Funktionskörpers in die Klassendefinition ist eine Möglichkeit. Es ist jedoch Sache des Compilers, ob er die Funktion tatsächlich inline ausführt.

    
Alok Save 08.06.2011 03:46
quelle
1

Es variiert zwischen den Compilern, aber im Allgemeinen: Ja, sie sollten.

Mit gcc erhalten Sie sowohl eine Inline- als auch eine Out-of-Line-Funktion. Die Out-of-Line-Version wird als "einmal verknüpfen" markiert. Unabhängig davon, wie viele Objekte einen Standardkonstruktor generieren, wird höchstens eine Version in der verknüpften Ausgabe angezeigt. Wenn tatsächlich niemand den Standardkonstruktor out-of-line verwendet, ist er überhaupt nicht in der verknüpften Ausgabe enthalten, und Sie haben effektiv eine reine Inline-Funktion.

    
John Ripley 08.06.2011 03:56
quelle