Maison  >  Article  >  développement back-end  >  Pourquoi les constructeurs de classes sans classes de base virtuelles apparaissent-ils dupliqués dans le code compilé par GCC ?

Pourquoi les constructeurs de classes sans classes de base virtuelles apparaissent-ils dupliqués dans le code compilé par GCC ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-16 16:01:03172parcourir

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

Double émission de symboles de constructeur

Comprendre le problème

Dans le code compilé par GCC, les constructeurs des classes sans classes de base virtuelles peuvent apparaître dupliqués dans la bibliothèque listings, soulevant des questions sur les raisons de ce comportement. Pour élaborer, l'Itanium C ABI définit un ensemble de conventions de dénomination pour les symboles C, y compris les constructeurs.

ABI Parsing

Examinons les noms mutilés de ces constructeurs :

  • _Z3fooEv : Constructeur pour Thing::foo()
  • _ZN5ThingC1Ei : constructeur d'objet complet pour Thing(int)
  • _ZN5ThingC2Ei : constructeur d'objet de base pour Thing(int)
  • _ZN5ThingC1Ev : constructeur d'objet complet pour Thing()
  • _ZN5ThingC2Ev : Constructeur d'objet de base pour Thing()

Comme vous pouvez le constater, les constructeurs se distinguent par le C1 (constructeur d'objet complet) et C2 (constructeur d'objet de base ) suffixes.

Les différents constructeurs

Cette dualité découle du polymorphisme support, même s'il n'est pas strictement nécessaire dans ce cas. Le constructeur d'objet complet initialise en outre les classes de base virtuelles, tandis que le constructeur d'objet de base initialise les membres de données et les classes de base non virtuelles.

Définitions multiples

Malgré plusieurs entrées dans les listes de bibliothèques, ces constructeurs en double le font ne provoque pas d'erreurs de "définition multiple du symbole __". En effet, l'ABI fournit des noms mutilés uniques pour chaque type de constructeur, garantissant qu'ils sont traités comme des symboles distincts par l'éditeur de liens.

Conclusion

La double émission de symboles de constructeur dans le code compilé par GCC est le résultat de la prise en charge du polymorphisme et des conventions de dénomination Itanium C ABI. Comprendre ces concepts éclaire les raisons de ce comportement et répond à toute préoccupation concernant plusieurs définitions.

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