C++ 虚继承 对象内存布局

-Xclang -fdump-record-layouts




下面是一张更改了部分代码的示意图,下图中是基于Clang编译器的结果

下面代码片段是基于GCC的结果,其中的jmp 后的地址,gcc是以.LTHUNK0 , .LTHUNK1, .LTHUNK2 来表示Base::Foo , Base2::Boo ,Derived::KKK函数:


Base1::Foo():
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        mov     rax, QWORD PTR [rbp-8]
        mov     QWORD PTR [rax+8], 255
        nop
        pop     rbp
        ret
virtual thunk to Base1::Foo():
        mov     r10, QWORD PTR [rdi]
        add     rdi, QWORD PTR [r10-24]
        jmp     .LTHUNK0


Base2::Boo():
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        mov     rax, QWORD PTR [rbp-8]
        mov     QWORD PTR [rax+8], 64
        nop
        pop     rbp
        ret
virtual thunk to Base2::Boo():
        mov     r10, QWORD PTR [rdi]
        add     rdi, QWORD PTR [r10-32]
        jmp     .LTHUNK1


Derived::KKK():
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        nop
        pop     rbp
        ret
virtual thunk to Derived::KKK():
        mov     r10, QWORD PTR [rdi]
        add     rdi, QWORD PTR [r10-40]
        jmp     .LTHUNK2
posted @ 2024-09-27 22:06  MarsCactus  阅读(14)  评论(0)    收藏  举报