首页 > 后端开发 > C++ > 正文

为什么没有虚拟基类的类的构造函数在 GCC 编译的代码中出现重复?

Susan Sarandon
发布: 2024-11-16 16:01:03
原创
171 人浏览过

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

构造函数符号的双重发射

理解问题

在 GCC 编译的代码中,没有虚拟基类的类的构造函数可能会在库中出现重复列表,引发有关此行为背后原因的疑问。详细来说,Itanium C ABI 为 C 符号定义了一组命名约定,包括构造函数。

ABI 解析

让我们检查一下这些构造函数的损坏名称:

  • _Z3fooEv:Thing::foo() 的构造函数
  • _ZN5ThingC1Ei:Thing(int) 的完整对象构造函数
  • _ZN5ThingC2Ei:Thing(int) 的基础对象构造函数
  • _ZN5ThingC1Ev:Thing() 的完整对象构造函数
  • _ZN5ThingC2Ev:Thing() 的基础对象构造函数

如您所见,构造函数通过 C1(完整对象构造函数)进行区分和 C2(基础对象构造函数)后缀。

不同的构造函数

这种二元性源于多态性支持,尽管在本例中并不是严格要求的。完整的对象构造函数还初始化虚拟基类,而基对象构造函数初始化数据成员和非虚拟基类。

多重定义

尽管库列表中有多个条目,但这些重复的构造函数确实不会导致“符号 __ 的多重定义”错误。这是因为 ABI 为每个构造函数类型提供了唯一的重整名称,确保链接器将它们视为不同的符号。

结论

GCC 编译代码中构造函数符号的双重发射是多态性支持和 Itanium C ABI 命名约定的结果。理解这些概念可以阐明此行为背后的原因,并解决有关多个定义的任何问题。

以上是为什么没有虚拟基类的类的构造函数在 GCC 编译的代码中出现重复?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板