成员函数、虚函数、this指针

1、成员函数的实现机制和普通(全局)函数没有本质区别,对编译器而言,经过名称处理以后(在函数名前加上命名空间、类名),一个成员函数就是普通函数了,在编译后的代码区域有确定的函数体和入口地址。最大的差别在于发生调用时,对于成员函数,编译器会隐含语句push this,其中this指针指向对象的地址,这就是操作所需要的数据的所在。编译后的成员函数调用可能是:
...
push this
call f
...
因此,在对类使用sizeof时,是无法看到成员函数占用空间的,因为其入口地址仅仅是在函数调用时由编译器确定,而类存储空间中无需记录任何有关成员函数的信息

2、而静态成员函数实际上就是普通函数,只不过编译器限制了它的名字可视范围而已(因为在编译时在函数名前加上了类名)。因此调用静态成员函数时不需要push this指针的,只需要在函数名字前加上类名限定符就可以了。

3、根据以上内容可以更好理解虚函数动态绑定。当一个类中定义了虚函数,编译器会为该类定义一个虚表,该虚表记录着所有虚函数的入口地址。与此同时,类的数据成员中会被插入一个虚指针指向这个虚表设置v-ptr必须发生在对基类构造函数的调用之后。因为,继承类如果有自己的虚函数表,那么v-ptr会被改写,以指向该表,即使此前v-ptr已经被基类所设置)。这就是为何定义成员函数不会改变sizeof(Class)的大小,而定义一个或多个虚函数均会使sizeof(Class)的大小增加4(虚指针的存储空间)。而在调用虚函数时,使用跟调用成员函数相同的策略,先push this,再根据this指向对象取得虚表中相应虚函数的入口地址,通过这样实现动态绑定,而不会像成员函数一样在编译时确定其入口地址。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值