虚函数表是什么时候生成的,虚函数表地址是什么时候给对象的?

虚函数表是一块连续的内存,每个内存单元中记录一个JMP指令的地址。

  • 首先,虚函数表在编译时候就已经确定;
  • 对象在构造前就已经分配好内存,在进入构造函数之前就已经将虚函数表地址给了对象了;
  • 进一步的,虚函数表给对象,在初始化列表之前;
  • 我们都知道初始化列表先于构造函数函数体实现;

vptr(虚函数表指针)什么时候创建出来的?

  • vptr跟着对象走,所以对象什么时候创建出来,vptr就什么时候创建出来,即程序运行的时候。
  • 实际上,对于这种有虚函数的类,在编译的时候,编译器会往相关的构造函数中增加 为vptr赋值的代码,这是在编译期间编译器为构造函数增加的。
  • 当程序运行的时候,遇到创建对象的代码,执行对象的构造函数,那么这个构造函数里有
    给对象的vptr(成员变量)赋值的语句,自然这个对象的vptr就被赋值了

虚函数表是什么时候创建的?

  • 实际上,虚函数表是编译器在编译期间(不是运行期间)就为每个类确定好了对应的虚函数表vtbl的内容。
  • 然后也是在编译器期间在相应的类构造函数中添加给vptr赋值的代码,这样程序运行的时候,当运行到成成类对象的代码时,会调用类的构造函数,执行到类的构造函数中的 给vptr赋值的代码,这样这个类对象的vptr(虚函数表指针)就有值了;

两者存放位置

虚函数表:属于类,类的所有对象共享这个类的虚函数表

虚函数指针:出于效率考虑,会放在每个对象的地址开始处

于是顺序如下:

  1. 构造父类;
  2. 将子类虚函数表地址给子类对象;
  3. 初始化列表进行初始化;
  4. 构造函数本体;
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值