大手子们,请教一个问题:
我在 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] <- 这里
1
3dwelcome 2022-03-30 09:37:08 +08:00
仅仅是名字不一样,base object constructor 和 complete object constructor 代码是一样的吧。
你可以用 gdb 调试一下,没有所谓的 complete object constructor ,就只是一个构造函数。 |
2
learningmachine OP @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 应该是相同的 |