C++中的虚函数表和虚函数在内存中的位置

本文探讨了C++中虚函数表和虚函数的内存位置。通过实例分析,揭示了虚函数表存在于只读数据段(.rodata),而虚函数位于代码段(.text)。实验通过g++编译器展示了如何找到并验证这些地址,进一步确认了虚函数表和虚函数在内存的不同区域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 目录

结论


       今天在看别人面经的时候发现了这个问题,一时间发现自己也说不清楚,还想当然的以为“虚函数表既然是类对象公有的,那么应该在静态存储区”,想当然终究只是想当然,经过试验得知,这种想法是错误的。

       由于不同的编译器在虚函数表上的实现可能不同,下面以g++来进行分析。

       先创建一个有虚函数的类A,如下所示:

class A
{
public:
	A(){};
	~A(){};
	virtual void vfun(){cout<<"vfun called!"<<endl;}
};

       既然要知道虚函数表的位置,那么自然就需要找到虚函数表的地址。我们知道,对于类A这种简单的类,其对象内存布局的最开始四个字节就是一个虚函数表指针(32位编译器),而这个指针变量的值自然就是虚函数表的地址了,因此,第一步就是获取这个虚函数表指针来找到虚函数表的地址:(可参考

A *a = new A();

long vbaddr=*(int *)a;   //虚函数表地址

       由于只有一个虚函数,所以虚函数表的前4个字节肯定就是vfun的函数地址,因此根据虚函数表的地址还可以得到虚函数vfun的地址:

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值