Maison >développement back-end >C++ >Pourquoi les symboles du constructeur C apparaissent-ils deux fois dans les bibliothèques statiques ?

Pourquoi les symboles du constructeur C apparaissent-ils deux fois dans les bibliothèques statiques ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-27 22:33:11818parcourir

Why Do C   Constructor Symbols Appear Twice in Static Libraries?

Double émission de symboles de constructeur

Dans le code C compilé avec GCC ou clang, les définitions de constructeur apparaissent souvent deux fois dans les bibliothèques statiques. Ce comportement soulève des questions sur la raison de cette duplication et ses implications.

Cause de la double émission

Selon l'ABI Itanium C, les noms mutilés des constructeurs sont constitués d'un préfixe , une classe imbriquée et un nom de fonction, une balise imbriquée de fin et des informations sur les paramètres. Cependant, pour les constructeurs dans les classes sans classes de base virtuelles, GCC émet en plus deux variantes : « constructeur d'objet complet » (C1) et « constructeur d'objet de base » (C2).

Cette double émission découle de la prise en charge par l'ABI de polymorphisme. Même si une classe n'a pas de classes de base virtuelles, l'ABI nécessite cette double émission pour faciliter la gestion polymorphe.

Implications de la double émission

Malgré l'émission de deux symboles constructeur, GCC alias les symboles avec le même code lors de l'optimisation de la compilation. Cela signifie qu'il n'y a pas d'erreurs de définition multiples.

De plus, le code assembleur généré pour les deux symboles constructeur démontre qu'ils appellent la même logique de constructeur sous-jacente. Quel que soit le symbole appelé, le constructeur d'objet complet est invoqué. Ce comportement implique que le symbole C2 est un vestige de la prise en charge du polymorphisme par l'ABI, même dans les cas où cela n'est pas strictement nécessaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn