虚指针、虚表及内存布局

本文详细介绍了C++中的虚指针和虚表的概念,阐述了虚函数在内存中的布局模型。通过实例代码展示了虚指针如何指向虚函数表,以及如何通过虚指针获取虚函数的入口地址。通过对派生类对象的内存分析,验证了虚函数相关概念,并提供了运行结果,加深了对虚函数和内存布局的理解。
摘要由CSDN通过智能技术生成

一、虚指针及虚表的概念

首先要清楚,所谓指针其实质就是一个内存地址值,形如0x12345678;

其次,要知道,函数名本身就是一个地址;

虚指针:其实就是一个地址值,以该地址为起始地址的一片内存单元存放着各虚函数的入口地址,这一片内存单元合起来就称为虚函数表(想象一下:一片内存单元存着许多函数地址,想执行哪个虚函数就来这片内存单元查找该虚函数的入口地址,就像查表一样,故称虚函数表)。经过以上解释,可以发现,所谓虚指针,就是个指向指针的指针

二、C++内存布局模型

我们在程序一般可以通过两种方式生成一个变量(注意这里的变量是广义的变量):一种是通过类型来生成(如 int a;Derived d);一种是通过new来申请内存并生成(如 Base * p = new Derived())。要知道的是,两种方式生成的变量在内存中是存放在不同的地方的:前一种方式生成的变量是存放在栈(stack)中的,而后一种方式生成的变量是存放在堆(heap)中的。栈是向下生长的(向地址减小的方向生长),也就是说晚生成的变量所在的地址比早生成的变量的地址要小(举例:int a;Derived d;因d生成时间晚于a,故 &a > &d);堆则相反,是向上生长的。稍后会在第三部分结合代码来理解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值