C++多态之——虚表地址所在内存空间的位置

news2024/9/20 18:05:26

众所周知,虚拟地址空间划分成了好几个部分,有堆区、栈区、常量区、静态区......

(500条消息) C/C++代码内存分布图_程序分布图_橙予清的zzz~的博客-CSDN博客icon-default.png?t=N6B9https://blog.csdn.net/weixin_69283129/article/details/126122989大家可以看这篇文章深入了解我们日常所写的C++代码都分布到了内存的哪些地方。

        我们可以模拟创建指向堆区空间、指向栈区空间的地址、创建存在于静态区和常量区的变量或常量,通过获取它们的地址就可以判断出虚表地址的大致位置到底处在内存的那一部分了。

试验案例: 

class A {
	virtual void Func1() {
		cout << "A:Func1()" << endl;
	}
	virtual void Func2() {
		cout << "A:Func2()" << endl;
	}
};

class B :public A {
	virtual void Func1() {
		cout << "B:Func1()" << endl;
	}

	
	virtual void Func3() {
		cout << "A:Func()" << endl;
	}
};

int main() {
	int i = 10;
	cout << "栈区:" << &i << endl;

	int* p = new int;
	cout << "堆区:" << &p << endl;

	const char* str = "hello bit!";
	cout << "代码区/常量区:" << &str << endl;

	static double d = 3.14;
	cout << "静态区:" << &d << endl;


	A a;
	cout << "父类对象a1虚表地址:" << (void*)(*(int*)&a) << endl;
}

代码解析:

        倒数第三行中,a是父类A的对象,&a就表示对象a的地址,因为对象a中有虚函数Func1()和Func2(),那么就有相应的虚表指针vfptr,而且虚表指针默认是类对象的第一个成员,且指针大小一般是4字节,使用int*(4字节)就可以提取出对象a的vfptr地址(4字节),之后解引用就是vfptr,因为目前vfptr是int*,需要转换为16进制的地址,需要转换为void* ,这样就可以计算出虚表指针指向的虚表的地址了!

运行结果: 

       

        从结果可知:虚表地址和常量区的地址最为接近,可以表面虚表地址是存在于常量区的位置中的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/819302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

食堂管理必备技巧,你学会了吗?

随着科技的不断进步和智能化的发展&#xff0c;各个领域都在积极探索如何将智能技术应用于实际生活中&#xff0c;学校食堂也不例外。 学校食堂作为学生日常生活的重要组成部分&#xff0c;其高效管理和优质服务对学生的学习和生活质量具有重要影响。为了满足学生和教职工对食堂…

docker容器的基本操作

一、查看Docker的版本信息 [roothuyang1 ~]# docker version 二、查看docker的详细信息 [roothuyang1 ~]# docker info 三、Docker镜像操作 Docker创建容器前需要本地存在对应的镜像&#xff0c;如果本地加载不到相关镜像&#xff0c;Docker默认就会尝试从镜像仓库https://hu…

3ds Max建模教程:模拟布料拖拽撕裂和用剑撕裂两种效果

推荐&#xff1a; NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 拖拽撕布 步骤 1 打开 3ds Max。 打开 3ds Max 步骤 2 在透视视口中创建平面。保持其长度 后座和宽度后座为 100。 创建平面 步骤 3 转到助手>假人并在 飞机的两侧。 助手>假人 步骤 4 选…

SpringBoot复习:(10)SpringApplication中的initializer成员变量是怎么初始化的?

initializers成员变量定义如下&#xff1a; 在构造方法里通过setInitializers setInitializers的代码很简单&#xff1a; 其中的参数通过getSpringFactoriesInstances来获取的&#xff0c;该方法的代码如下&#xff1a; 其中调用的重载的方法代码如下&#xff1a; 它调用…

python-网络爬虫.BS4

BS4 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库&#xff0c; 它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方 式。 Beautiful Soup 4 官方文档&#xff1a;https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 帮助手册&…

雷达信号处理技术汇总

系列文章目录 《雷达简单介绍》 《信号类型&#xff08;雷达&#xff09;——雷达波形认识&#xff08;一&#xff09;》 《信号类型&#xff08;雷达&#xff09;——连续波雷达&#xff08;二&#xff09;》 《信号类型&#xff08;雷达&#xff09;——脉冲雷达&#xf…

clickhouse查询缓存

为了实现最佳性能&#xff0c;数据库需要优化其内部数据存储和处理管道的每一步。但是数据库执行的最好的工作是根本没有完成的工作&#xff01;缓存是一种特别流行的技术&#xff0c;它通过存储早期计算的结果或远程数据来避免不必要的工作&#xff0c;而访问这些数据的成本往…

C++高级编程

本阶段主要针对C泛型编程和STL技术做详细讲解&#xff0c;探讨C更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具&#xff0c;大大提高复用性 模板的特点&#xff1a; 模板不可以直接使用&#xff0c;它只是一个框架模板的通用并不是万能的 1.2 函数模板 C另一…

前端页面---滑动分离登录页面

效果图如下&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equ…

电脑e盘不见了怎么办?3个方法帮你找回!

“很奇怪很奇怪&#xff0c;为什么我电脑上的e盘莫名其妙就没了呢&#xff1f;我有些文件还保存在里面呢&#xff0c;现在有什么方法能帮我把e盘找回来吗&#xff1f;” E盘通常是我们存储数据和文件的重要驱动器之一。如果电脑e盘不见了&#xff0c;我们可能也会感到很焦虑。虽…

Vue+Element Plus 初始化

1. 初始化 Vue 项目 创建vue3 项目 vue create k8s-platform-fe 2. 引入 Element Plus 安装 element-plus 首先去安装这些依赖包&#xff0c;安装好了将其引入&#xff0c;引入的方式有全局引用和局部引入。其实和组件是一样的&#xff0c;局部引入哪里引入哪里使用。…

API教程:轻松上手HTTP代理服务!

作为HTTP代理产品供应商&#xff0c;我们为您带来一份详细的教程&#xff0c;帮助您轻松上手使用API&#xff0c;并充分利用HTTP代理服务。无论您是开发人员、网络管理员还是普通用户&#xff0c;本教程将为您提供操作指南和代码模板&#xff0c;确保您能够顺利使用API并享受HT…

Ubuntu安装harbor(http模式)并随便上传一个

Ubuntu安装harbor&#xff08;http模式&#xff09; docker和harbor的介绍就免了&#xff0c;都不知道啥东西&#xff0c;还安装搞毛 先安装docker环境 不要问&#xff0c;软件源之类的配置&#xff0c;挨个梭就行 sudo apt update sudo apt install apt-transport-https ca…

python简单的病毒编程代码,如何用python写一个病毒

大家好&#xff0c;本文将围绕python简单的病毒编程代码展开说明&#xff0c;如何用python做恶搞病毒是一个很多人都想弄明白的事情&#xff0c;想搞清楚如何用python写一个病毒需要先了解以下几个事情。 1、Python能不能写病毒 国家计算机病毒应急处理中心通过对互联网的监测…

刷题笔记:day 1

力扣 283 移动零 解法一&#xff1a;双指针 定义一个指针 cur 去遍历数组 &#xff1b; 定义一个指针 dest 去指向已处理区间中&#xff0c;非零的最后一个位置。 然后让 指针 cur 遇到 0 &#xff0c;就往后走 &#xff1b; 遇到的数不是 0 &#xff0c;就与 dest指针的下…

C语言结构体讲解

目录 结构体的声明 结构的基础知识 结构的声明 为什么要出现结构体&#xff1f; 结构成员的类型 结构体变量的定义和初始化 定义&#xff1a;&#xff08;全局变量//局部变量&#xff09; 初始化&#xff1a; 结构体成员的访问 结构体传参 结构体的声明 结构的基础知识…

会议oa系统项目部署流程

目录 1.项目部署环境 2.初始化数据库 2.1获取数据库脚本 2.2创建数据库 1.创立数据库连接 2.创建数据库&#xff0c;命名 3.运行sql文件 4.查看导入数据 ​编辑 ​编辑 3项目环境部署 3.1导入项目资源 3.2加载框架 加载成功标志 服务器配置&#xff08;用来保存排…

详解跨境电商ERP开发的核心技术

跨境电商行业的蓬勃发展为企业带来了前所未有的机遇&#xff0c;然而&#xff0c;成功经营跨境电商业务需要高效的管理和操作。在这方面&#xff0c;跨境电商ERP系统成为了关键的工具&#xff0c;能够整合各个业务环节&#xff0c;实现高效运作和优化决策。本文将详解跨境电商E…

一文看懂kubernetes部署:持久卷的安装

持久卷的安装 NFS服务的建立 为了实现elasticsearch以及rabbitmq的数据持久化&#xff0c;需要在k8s中建立持久卷&#xff0c;我们采用nfs方式建立持久卷。 对于持久卷的结构规划如下&#xff1a; 关于索引的磁盘占用&#xff1a; 请根据业务的数据量情况来规划持久卷硬件的情…

android Android Studio Giraffe | 2022.3.1 版本Lombok不兼容 解决方案

android Android Studio Giraffe | 2022.3.1 版本Lombok不兼容 解决方案 1.查看当前的android studio 版本 Android Studio Giraffe | 2022.3.1 Build #AI-223.8836.35.2231.10406996, built on June 29, 2023 2.打开 idea 官网下载页面 idea下载历史版本 找到对应的版本编号…