服务器之家

服务器之家 > 正文

探究c++虚表实现代码

时间:2022-01-04 15:20     来源/作者:不会写代码的丝丽

本文简单探究虚表实现。

如下代码中有一个基类CPerson和子类CStudent:public.并有两个虚函数runcry

#include<iostream>
using namespace std;
class CPerson {
public:
	virtual	void run() {
		cout << "Person is  runing. \r\n";
	}
	virtual void cry() {
		cout << "Person is  cry. \r\n";
	}
};
class CStudent:public CPerson {
public:
	void run() {
		cout << "Student is  runing. \r\n";
	}
	void cry() {
		cout << "Student is  cry. \r\n";
	}
};
int main() {
	CPerson * pStudent = new CStudent();
	pStudent->run();
	getchar();
	return 0;
}

VScl提供了对应命令行查看类的内存布局。
语法cl /d1 reportSingleClassLayoutXXXX YYYY。其中XXX为类名,YYYY为所在文件全路径。
如本例:
cl /d1 reportSingleClassLayoutCStudent \\Mac\Main.cpp输出如下:

探究c++虚表实现代码

我们再看下CPerson的输出:

探究c++虚表实现代码

上面的图可能很抽象,大致的意思一个CStudent的内存区域中的第一个内存区域存放一个4字节指针,指针指向一个另一个内存区域,这个内存区域我们称为虚表。虚表内存结构可以理解为一个数组,数组中的每个元素是一个函数指针。指向函数地址。

示例图:

探究c++虚表实现代码

空说无凭,我们利用VS内存查看器和汇编器证实猜测。

探究c++虚表实现代码

上图简单来说就是:
(1) 构造了一个CStudent对象,地址为0x00d88d28
(2) 进入对象的地址,对象内存的第一个4字节区域为0x00f89b78,这个存储的数值为虚表指针位置。
(3) 进入虚表内存地址,发现存储了两个指针 0xf8105f0xf81406.

我们再次跳转到0xf8105f内存地址,此时我们查看汇编级别代码。发现是一个jmp指令跳转到实际CStudent::run函数.

探究c++虚表实现代码

同理0xf81406如下图所示:

探究c++虚表实现代码

其他扩展知识:

虚表在编译时已经构造完成,在构造对象时,会根据对象的类型在初始化时赋值虚表地址给对象的vfptr 。我们把这种行为称为动态绑定(Dynamic Binding)

到此这篇关于探究c++虚表实现代码的文章就介绍到这了,更多相关c++虚表内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://fanmingyi.blog.csdn.net/article/details/108288254

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部