V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
learningmachine
V2EX  ›  C++

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

  •  
  •   learningmachine · 2022-03-30 09:22:34 +08:00 · 1640 次点击
    这是一个创建于 975 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    我在 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 条回复    2022-03-30 20:53:02 +08:00
    3dwelcome
        1
    3dwelcome  
       2022-03-30 09:37:08 +08:00
    仅仅是名字不一样,base object constructor 和 complete object constructor 代码是一样的吧。

    你可以用 gdb 调试一下,没有所谓的 complete object constructor ,就只是一个构造函数。
    learningmachine
        2
    learningmachine  
    OP
       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 应该是相同的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1819 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:01 · PVG 08:01 · LAX 16:01 · JFK 19:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.