c++ 对象构造的 “complete object constructor” 和 “base object constructor”?

2022-03-30 09:22:34 +08:00
 learningmachine

大手子们,请教一个问题:

我在 godbolt 写了一个对象 new/delete 的 demo ,我看汇编里面调用完 operator new() 获取到空间后,调用了对象的“complete object constructor”,但是生成的汇编里面只有一个 “base object constructor” 做了一个 vtable 的赋值,但是没有 “complete object constructor” 汇编,怎么找到 “complete object constructor” 是具体是怎么实现的呢?

godbolt 地址: https://godbolt.org/z/6q1GEeqzW

        mov     edi, 16
        call    operator new(unsigned long)
        mov     rbx, rax
        mov     rdi, rbx
        call    A::A() [complete object constructor] <- 这里

1451 次点击
所在节点    C++
2 条回复
3dwelcome
2022-03-30 09:37:08 +08:00
仅仅是名字不一样,base object constructor 和 complete object constructor 代码是一样的吧。

你可以用 gdb 调试一下,没有所谓的 complete object constructor ,就只是一个构造函数。
learningmachine
2022-03-30 20:53:02 +08:00
@3dwelcome 谢谢你的方法

我在本地用 gdb 调试了一下,发现 https://godbolt.org/z/6q1GEeqzW 这个 demo 里面的构造就是调用的 ABI 标识符号是 _ZN1AC2Ev ( c++filt 后是 A::A()),根据 ABI ( https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling-special-ctor-dtor )的解释,应该是 “base object constructor”,和 goltbolt 的结果有些不一致,我猜测是平台的问题。

后面我在 goltbolt 中发现 Filter 选项会把 "Unused labels" 给过滤掉,取消过滤后找到了原因。
有一段:

.weak _ZN1AC1Ev
.set _ZN1AC1Ev,_ZN1AC2Ev

demangle 后是:

.weak A::A() [complete object constructor]
.set A::A() [complete object constructor],A::A() [base object constructor]

将 A::A() [complete object constructor] 指向 A::A() [base object constructor]。

在目前这种情况下,这两种 constructor 应该是相同的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/843775

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX