C++部分知识点对应汇编代码

1.类初始化

通过类对象调用函数时,this指针会作为第一个参数

cpp 复制代码
class MySharePtr {
    public:
    MySharePtr(int val) : a(val) {
        // a = val;				// 不使用初始化列表的方式
    }
    int a = 10;
};

// 使用初始化列表的方式, 直接使用传入的参数进行构造
MySharePtr::MySharePtr(int) [base object constructor]:
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        mov     DWORD PTR [rbp-12], esi
        mov     rax, QWORD PTR [rbp-8]
        mov     edx, DWORD PTR [rbp-12]
        mov     DWORD PTR [rax], edx
        nop
        pop     rbp
        ret

// 不使用初始化列表的方式, 在有默认值的情况下,明显是先按照默认值赋值后,再使用传入的参数进行构造
MySharePtr::MySharePtr(int) [base object constructor]:
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        mov     DWORD PTR [rbp-12], esi
        mov     rax, QWORD PTR [rbp-8]
        mov     DWORD PTR [rax], 10
        mov     rax, QWORD PTR [rbp-8]
        mov     edx, DWORD PTR [rbp-12]
        mov     DWORD PTR [rax], edx
        nop
        pop     rbp
        ret

因此对于常量成员或引用类型成员,必须在初始化列表中进行初始化,因为它们无法在构造函数体内赋值。

动态内存调用,因为事先知道类的大小,因此首先将该类大小作为第一个参数,调用new函数申请空间,再调用相应构造函数。

2.多重继承下的虚函数

  1. 之前,看其他博客上,有很多人说多重继承下虚函数表指针是依次放在类存储空间头部的。
    但,今天在看gcc13.2编译后的汇编代码时,发现虚函数表指针在存储的布局如下所示
cpp 复制代码
vptr base class1
base class1 datamember
vptr base class2
base class2 datamember

vtable for Soccerr:
        .quad   0
        .quad   typeinfo for Soccerr
        .quad   Soccerr::printId()
        .quad   Soccerr::printId3()
        .quad   Soccerr::printId4()
        .quad   -16
        .quad   typeinfo for Soccerr
        .quad   PlayerSP::printIdSP()

这种方式在类初始化时比较简单,因为已经知道基类大小,只需要初始化基类1,偏移基类1大小,初始化基类2即可。

  1. 上述的.quad -16表示的是,将Soccerr类转换为PlayerSP基类的偏移量。
相关推荐
syker5 分钟前
NEWBASIC 2.06.7 API 帮助与用户使用手册
开发语言·人工智能·机器学习·自动化
Js_cold5 分钟前
Verilog运算符
开发语言·fpga开发·verilog
努力还债的学术吗喽21 分钟前
【项目】pyqt5基于python的照片整蛊项目
开发语言·python·qt
m0_5695310126 分钟前
shell(4)--shell脚本中的循环:(if循环,for,while,until)和退出循环(continue,break, exit)
开发语言
星释29 分钟前
Rust 练习册 :掌握文本处理与词频统计
开发语言·后端·rust
火龙谷30 分钟前
DrissionPage遇到iframe
开发语言·前端·javascript
花阴偷移39 分钟前
逆向基础--汇编基础(段的分类) (07)
汇编
YeGop41 分钟前
51单片机数码管显示函数分享(8051汇编)
汇编·嵌入式硬件·51单片机
花阴偷移43 分钟前
逆向基础--汇编基础(DOS安装与介绍) (06)
汇编
HalvmånEver1 小时前
Linux的第二章 : 基础的指令(二)
linux·运维·服务器·开发语言·学习