learningmachine
V2EX  ›  C++

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

  •  
  •   learningmachine · Mar 30, 2022 · 2375 views
    This topic created in 1506 days ago, the information mentioned may be changed or developed.

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

    我在 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] <- 这里
    
    
    2 replies    2022-03-30 20:53:02 +08:00
    3dwelcome
        1
    3dwelcome  
       Mar 30, 2022
    仅仅是名字不一样,base object constructor 和 complete object constructor 代码是一样的吧。

    你可以用 gdb 调试一下,没有所谓的 complete object constructor ,就只是一个构造函数。
    learningmachine
        2
    learningmachine  
    OP
       Mar 30, 2022
    @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 应该是相同的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5822 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 510ms · UTC 01:58 · PVG 09:58 · LAX 18:58 · JFK 21:58
    ♥ Do have faith in what you're doing.