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

在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)在一份程序中,一个类只有一个虚函数表。

猜你喜欢

转载自blog.csdn.net/m0_37844072/article/details/121875648