虚函数表和虚函数表指针

讲解一下虚函数表和虚函数表指针中的几个关键问题:

1.基类的虚函数表存放在内存的什么区?

首先我们要知道虚函数表的是全局共享的元素,即全局只有一个,在编译的时候构造完成。

虚函数表类似一个数组,类对象中存储vptr指针指向虚函数表,即虚函数表不是函数,不是程序代码,不可能存储在代码段。

虚函数表存储虚函数的地址,即虚函数表的元素是指向类成员函数的指针,而类中虚函数的个数在编译时期就可以确定,即虚函数表的大小可以确定,即大小是在编译时期确定的,不必动态分配内存空间存储虚函数表,所以不在堆中

根据以上的特点可知,虚函数表vtable在linux/Unix中存放在可执行文件的只读数据段中(rodata),这和微软的编译器将虚函数表存放在常量段中有一些差别。

2. 虚函数表指针vptr的初始化时间?

vptr的创建时间是在构造函数执行时会对虚函数表指针进行初始化,并且存在对象内存布局的最前面。让虚函数表指针指向虚函数表,我们要知道的是,虚函数表指针在每个对象中是不一样的,但是它们指向的虚函数表是一样的。

3.构造函数可以虚函数吗?

不能。虚函数对应一个vtable(虚函数表),类中存储一个vptr指向这个vtable。如果构造函数是虚函数,就需要通过vtable调用,可是对象没有初始化就没有vptr,无法找到vtable,所以构造函数不能是虚函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值