Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erscheinen Konstruktoren für Klassen ohne virtuelle Basisklassen in GCC-kompiliertem Code dupliziert?

Warum erscheinen Konstruktoren für Klassen ohne virtuelle Basisklassen in GCC-kompiliertem Code dupliziert?

Susan Sarandon
Susan SarandonOriginal
2024-11-16 16:01:03171Durchsuche

Why do constructors for classes without virtual base classes appear duplicated in GCC-compiled code?

Doppelte Emission von Konstruktorsymbolen

Verstehen des Problems

In GCC-kompiliertem Code werden Konstruktoren für Klassen ohne virtuelle Basisklassen möglicherweise doppelt in der Bibliothek angezeigt Einträge, die Fragen zu den Gründen für dieses Verhalten aufwerfen. Um es näher zu erläutern: Das Itanium C ABI definiert eine Reihe von Namenskonventionen für C-Symbole, einschließlich Konstruktoren.

ABI-Analyse

Lassen Sie uns die verstümmelten Namen dieser Konstruktoren untersuchen:

  • _Z3fooEv: Konstruktor für Thing::foo()
  • _ZN5ThingC1Ei: Vollständiger Objektkonstruktor für Thing(int)
  • _ZN5ThingC2Ei: Basisobjektkonstruktor für Thing(int)
  • _ZN5ThingC1Ev: Vollständiger Objektkonstruktor für Thing()
  • _ZN5ThingC2Ev: Basisobjektkonstruktor für Thing()

Wie Sie sehen können, werden die Konstruktoren durch C1 (vollständiger Objektkonstruktor) und C2 (Basisobjektkonstruktor) unterschieden ) Suffixe.

Die verschiedenen Konstruktoren

Diese Dualität ergibt sich aus Polymorphismus-Unterstützung, obwohl dies in diesem Fall nicht unbedingt erforderlich ist. Der vollständige Objektkonstruktor initialisiert zusätzlich virtuelle Basisklassen, während der Basisobjektkonstruktor Datenelemente und nicht virtuelle Basisklassen initialisiert.

Mehrere Definitionen

Trotz mehrerer Einträge in Bibliothekslisten tun dies diese doppelten Konstruktoren verursacht keine „Mehrfachdefinition des Symbols __“-Fehler. Dies liegt daran, dass die ABI für jeden Konstruktortyp eindeutige entstellte Namen bereitstellt und so sicherstellt, dass sie vom Linker als unterschiedliche Symbole behandelt werden.

Schlussfolgerung

Die doppelte Ausgabe von Konstruktorsymbolen in GCC-kompiliertem Code ist ein Ergebnis der Polymorphismusunterstützung und der Itanium C ABI-Namenskonventionen. Das Verständnis dieser Konzepte beleuchtet die Gründe für dieses Verhalten und räumt etwaige Bedenken hinsichtlich mehrerer Definitionen aus.

Das obige ist der detaillierte Inhalt vonWarum erscheinen Konstruktoren für Klassen ohne virtuelle Basisklassen in GCC-kompiliertem Code dupliziert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn