- 博客(33)
- 收藏
- 关注
原创 深入理解构造函数中的执行顺序
代码public :test1() {public :test2() {public :Base() {} };test2 t2;return 0;汇编。
2023-07-02 23:53:13
247
原创 vcall的深入理解
在 C++ 中,vcall(虚函数调用)是通过虚表(vtable)来实现的,用于在运行时动态地调用适当的虚函数。虚函数是指在基类中声明为 virtual 的函数,并在派生类中进行重写的函数。当通过基类指针或引用调用虚函数时,会使用 vcall 机制确定要调用的实际函数。vcall 的主要目的是实现多态性,即在运行时根据对象的真实类型来调用适当的函数。它使得在编写具有继承和多态性质的代码时更加灵活和方便。
2023-06-27 00:41:37
429
原创 RTTI(运行时类型信息)
RTTI 是 “Run-Time Type Information”(运行时类型信息)的缩写。它是 C++ 提供的一种机制,用于在运行时获取和操作对象的类型信息。C++ 是一种静态类型语言,这意味着在编译时大部分类型信息是已知的。然而,有些情况下,我们需要在运行时动态地获取对象的类型信息,以便进行类型检查、类型转换和多态操作等。RTTI 是通过在对象的内存布局中添加额外的元数据信息来实现的。因此,它会增加对象的存储空间和运行时开销。
2023-06-26 00:27:42
597
原创 深入理解虚函数表
它通过thunk偏移,跳转了很多函数,但是最终还是调用了子类的析构函数,子类的析构函数调用了两个父类的析构函数,完成了内存的释放!一定一定一定要写虚析构函数。
2023-06-24 00:04:35
129
原创 虚函数参数固定值为题
就是运行的时候才可以确定的当虚函数有省略参数,并且重写了,需要根据静态类型和动态类型来区分省略参数的绑定时机和虚函数的调用尽量避免重写父类的虚函数,这样可以避免该问题通常情况下静态类型在等号的左边。
2023-06-21 23:37:40
96
原创 虚继承菱形继承第二层vbtable分析
现在vbtable是12个字节了,第4-7字节存放8,第8-11字节存放12,8对应着m_a1到对象头的偏移距离,12对应着m_a2到对象头的偏移距离。vbtable的前4个字节存储的是-4,那么对应的是应该是vbptr到首地址的偏移量,后四个字节存储的是8,对应着m_a1到vbptr的偏移量。可以看见,跟以往不同的是前面四个字节也有了空间,根据补码转换器,是-4,负数在计算机中是用补码的方式表示的。这就是vbptr所指向的虚函数表,是占8个字节的,前面四个为0,后面四个为8。虚函数表最少占用8个字节。
2023-06-20 00:23:01
135
原创 初探虚继承
虚继承通常是用来解决菱形继承的,菱形继承会出现二义性。看注释的那句话,存在二义性,编译器不知道调用哪一个m_a;D占用8个字节,所以里面存在两个m_a解决方法就是虚继承,将代码简单修改可以看见,菱形继承解决了二义性,但是sizeof的空间增大了,这时因为多了vbptr。
2023-06-18 01:10:29
95
原创 利用工具查看vftable
利用工具查看vftablewindow下载了vs会自带一个VS 2017的开发人员命令提示符,我们借助它来查看vftable首先准备一段代码#include <iostream>class base1{public: base1(){} virtual void Fun1Base1() { std::cout << "base1::Fun1Base1" << std::endl; } virtual void Fun2Base1() { std::c
2023-06-12 23:43:56
180
原创 vptr在对象中的位置关系
我在第20行设置了断点开始debug,先获得到了a所指向的地址,在内存中把这块地址找出来,再按下一步,发现第5-8个字节发生了改变,变成了1,所以我断定vptr是存放在对象的最前面的。将a的地址强转成char,将a->a的地址强转成char,判断这两个char的地址是否相等便知。
2023-06-11 00:30:20
146
原创 C++初始化列表的效率问题
对于基本数据类型、指针、引用这些时,初始化成员列表并没有什么很大的提升,但是使用自定义类型时,效率会得到很大的提升,可以少调用一次无参构造必须要清楚初始化列表的执行顺序,以免初始化为一个没有初始化的变量。
2023-06-10 22:24:56
178
原创 简单理解COFF文件
COFF文件是我在初学对象模型的时候看底层代码用的,是通过obj文件转换的,也就是一种目标文件官方描述:COFF(Common Object File Format)是一种常见的目标文件格式,用于存储可重定位目标文件、静态库文件和可执行文件。COFF最初由UNIX System Laboratories(USL)定义,现在被广泛地使用在各种操作系统上,包括Windows、Linux和BSD等。
2023-06-10 17:57:57
2273
原创 Finalshell的连接VM虚拟机问题
原本以为成功了,结果还是不行,于是再次百度找问题!,最后发现是虚拟机网卡没有开,于是打开再次连接虚拟机就成功了!(3)启动22端口(其他也行,可以设置)4.防火墙(关闭防火墙)1.安装openssh。出现sshd 说明好了。
2023-06-10 00:52:18
2046
原创 C++默认生成拷贝构造
当类中有成员类,并且成员类有拷贝构造函数,此时会生成该类的拷贝构造,调用成员类的拷贝构造当父类中有拷贝构造函数,此时会生成该类的拷贝构造,调用父类的拷贝构造当类中有虚函数时,此时会生成拷贝构造函数,掉用虚表拷贝vftable当使用虚继承时,此时会生成拷贝构造函数,调用虚基类表拷贝vbtable默认生成的拷贝构造并不是执行赋值操作,只会调用其它拷贝构造,赋值还是由编译器自动处理此上所有条件都必须在可以执行拷贝构造函数的代码中才生效。
2023-06-09 00:04:47
186
原创 C++多继承中的this指针
根据输出,证明了我们的猜想,共用的永远都是第一个继承对象,后面的对象在调用的时候编译器应该是会自动转换this地址的。可以看见对象A和C是公用的一个地址,由此我们推断多继承与第一个对象共用地址,修改顺序,再来看输出。这里就可以想到有虚函数多继承公用virtul table的例子,原理应该也是这样。在C++继承中其中一个父类会与子类公用一个地址,本文字探索究竟公用的哪一个地址。废话不多说,直接上代码。
2023-06-07 00:34:32
362
1
原创 一个空对象为什么占1个字节
辅助操作完成后第一个字节变成了1,后面3个字节都变成了0,对象地址跟第一个遍历应该是用的同一个地址,类似数组和数组地址一样,第0个元素跟数组用的同一个地址。通过调试可以发现,对象a是有地址的,这个地址刚好占用了1个字节,只要有对象创建就一定会有地址,所以一定会有字节。在八股文中,经常有写道,要给空对象占用1个字节,那么明明是空的,为什么还会占用一个字节?现在给对象一个int类型,看一下赋值对内存的改变,现在应该是占用4个字节。
2023-06-06 13:16:27
208
1
原创 memcpy与memmove
笔者在看项目源码的时候发现了STL底层大量的使用了memmove函数,由于笔者能力有限,之前只使用过memcpy,所以相对这两个函数做一个对比进行一下记录。这是我手动实现的两个函数原型,两者的功能都是一样的,将src中的count个内存拷贝到des中去,非常的使用,下面说一下区别。memmove会考虑到内存重叠的问题举个例子这个例子中有3个字节重叠了,你可以思考一下这里的结果,肯定是不一样的,留下悬念,这里不给答案。
2023-05-19 10:28:30
179
1
原创 C++单例模式
单例是设计模式里面的一种,全局有且只有一个类的static实例,在程序任何地方都能够调用到。单例模式分为懒汉模式(线程不安全)和饿汉模式;
2023-05-16 15:21:41
169
1
原创 Git常用命令
实践才是检验真理的唯一标准。多看、多敲、多写、多练。提交拉取最新仓库版本回退分支大概率会遇到的问题当前仓库和远程仓库数据没有同步解决办法:先同步一下仓库,在进行推送分支合并冲突冲突产生原因:分支合并时,两个分支在同一文件的同一位置有着不同的修改,这时git无法替代我们保留哪一个,需要我们手动介入修改。此时git命令窗会出现手动打开文件进行修改,会出现===============进行分割,修改提交命令解决分支冲突手动修改代码肯定是繁琐的,下面将介绍小乌龟
2023-04-20 23:45:30
127
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人