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基类的偏移量。
相关推荐
青莳吖5 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
Buleall12 分钟前
期末考学C
java·开发语言
重生之绝世牛码14 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
小蜗牛慢慢爬行20 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157630 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
shinelord明39 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
Monly211 小时前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu1 小时前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee20211 小时前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
小俊俊的博客1 小时前
海康RGBD相机使用C++和Opencv采集图像记录
c++·opencv·海康·rgbd相机