Doppelte Emission von Konstruktorsymbolen
In mit GCC oder Clang kompiliertem C-Code erscheinen Konstruktordefinitionen in statischen Bibliotheken oft zweimal. Dieses Verhalten wirft Fragen über den Grund für diese Duplizierung und ihre Auswirkungen auf.
Ursache der doppelten Emission
Laut Itanium C ABI bestehen Konstruktor-verstümmelte Namen aus einem Präfix , ein verschachtelter Klassen- und Funktionsname, ein endverschachteltes Tag und Parameterinformationen. Für Konstruktoren in Klassen ohne virtuelle Basisklassen gibt GCC jedoch zusätzlich zwei Varianten aus: „vollständiger Objektkonstruktor“ (C1) und „Basisobjektkonstruktor“ (C2).
Diese doppelte Emission ergibt sich aus der Unterstützung des ABI für Polymorphismus. Auch wenn eine Klasse keine virtuellen Basisklassen hat, benötigt der ABI diese doppelte Emission, um die polymorphe Handhabung zu erleichtern.
Auswirkungen der doppelten Emission
Obwohl zwei Konstruktorsymbole ausgegeben werden, GCC ordnet den Symbolen während der Kompilierungsoptimierung einen Alias für denselben Code zu. Dies bedeutet, dass es keine Mehrfachdefinitionsfehler gibt.
Darüber hinaus zeigt der für beide Konstruktorsymbole generierte Assemblercode, dass sie dieselbe zugrunde liegende Konstruktorlogik aufrufen. Unabhängig davon, welches Symbol aufgerufen wird, wird der vollständige Objektkonstruktor aufgerufen. Dieses Verhalten impliziert, dass das C2-Symbol ein Überbleibsel der ABI-Unterstützung für Polymorphismus ist, auch in Fällen, in denen dies nicht unbedingt erforderlich ist.
Das obige ist der detaillierte Inhalt vonWarum erscheinen C-Konstruktorsymbole in statischen Bibliotheken zweimal?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!