虚函数,虚函数指针,虚函数表在内存的分布

在c++中,对于一个不含虚函数的类,它的大小为变量的大小,不包含在类里面的非虚函数。

  • case 1:类中只有变量
class Base1
{
public:
    int base1_1;
    int base1_2;

    // void foo(){}
};

比如对于Base1来说,有无foo()函数,sizeof(Base1)的大小都为8,说明类自身的函数不计入类的大小,其实也很合理,比如定义10个Base1,但这10个Base1用的是同一个方法,这样可大大的节约类占的内存。

  • case 2:类中含有一个函数指针
class Base2
{
public:
    int base1_1;
    int base1_2;

    void (*foo)();
};

对于Base1来说,他的大小为16, 相比于Base1多了8个字节的函数指针。

  • case 3:类中含有一个/多个虚函数
class Base3
{
public:
    int base1_1;
    int base1_2;

    virtual void base1_fun1() {}
    // virtual void base1_fun2() {}
    // ...

};

对于Base3来说,他的大小为16, 说明虚函数是要占内存的。

但是我加了很多个虚函数,发现内存大小依然是16,经过查阅资料,发现,类中的虚函数是通过一个叫虚指针去管理的,也就是

一个指针(__vptr)记录了存放这个类里面所有的虚函数的内存地址,

而这个存这个类所有虚函数的这片内存,称之为虚函数表。而访问虚函数表的每个虚函数则是通过__vptr[0],__vptr[1],。。。

对于Base3,在内存中大概就是这样。

如果Base3加上virtual void base1_fun2() {},在内存中大概就是这样。

  • case 4 :多个类共用一个虚函数表,每个类有自己的虚指针。
#include "stdio.h"

class Base1
{
public:
    int base1_1;
    int base1_2;

    virtual void base1_fun1() {}
    virtual void base1_fun2() {}

};

int main()
{
    Base1 b1;
    Base1 b2;

}

 按照上述例子声明,会发现:(1)b1和b2有自己的虚指针 (2)在一份程序中,一个类只有一个虚函数表。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值