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.
Lassen Sie uns die verstümmelten Namen dieser Konstruktoren untersuchen:
Wie Sie sehen können, werden die Konstruktoren durch C1 (vollständiger Objektkonstruktor) und C2 (Basisobjektkonstruktor) unterschieden ) Suffixe.
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.
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.
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!