构造函数符号的双重发射
在使用 GCC 或 clang 编译的 C 代码中,构造函数定义通常在静态库中出现两次。此行为引发了有关此重复的原因及其含义的问题。
双重发射的原因
根据 Itanium C ABI,构造函数损坏的名称由前缀组成、嵌套类和函数名称、结束嵌套标记和参数信息。然而,对于没有虚拟基类的类中的构造函数,GCC 另外发出两种变体:“完整对象构造函数”(C1) 和“基对象构造函数”(C2)。
这种双重发射源于 ABI 对多态性。即使类没有虚拟基类,ABI 也需要这种双重发射来促进多态处理。
双重发射的含义
尽管发射两个构造函数符号, GCC 在编译优化期间将符号别名为相同的代码。这意味着不存在多个定义错误。
此外,为两个构造函数符号生成的汇编代码表明它们调用相同的底层构造函数逻辑。无论调用哪个符号,都会调用完整的对象构造函数。此行为意味着 C2 符号是 ABI 支持多态性的遗迹,即使在并非绝对必要的情况下也是如此。
以上是为什么 C 构造函数符号在静态库中出现两次?的详细内容。更多信息请关注PHP中文网其他相关文章!