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