本文以最简洁的方式了解不同情况下类中内存的占用
直接定义七个类:
A中包含普通函数,虚函数,两个int类型成员变量和一个char型成员变量;
B中包含普通函数,成员变量(成员变量与A一致);
C中只包含普通成员函数;
D中只有成员变量;
E中只有虚函数;
F中包含普通函数,虚函数;
G中包含虚函数,成员变量。
class A{
public:
void add1(){cout<<"add1"<<endl;}
virtual void add2(){cout<<"add2"<<endl;}
private:
int a,b;
char c;
};
class B{
public:
void add3(){cout<<"add3"<<endl;}
private:
int a,b;
char c;
};
class C{
public:
void add4(){cout<<"add4"<<endl;}
};
class D{
private:
int a,b;
char c;
};
class E{
public:
virtual void add5(){cout<<"add5"<<endl;}
};
class F{
public:
void add6(){cout<<"add6"<<endl;}
virtual void add7(){cout<<"add7"<<endl;}
};
class G{
public:
virtual void add8(){cout<<"add8"<<endl;}
private:
int a,b;
char c;
};
对七个类sizeof的输出如下:
只有成员变量时大小sizeof(D):12
成员变量和普通函数的大小sizeof(B):12
只有普通函数的大小sizeof(C):1
只有虚函数大小sizeof(E):4
虚函数和普通函数的大小sizeof(F):4
虚函数、普通函数、成员变量大小sizeof(A):16
虚函数和成员变量大小sizeof(G):16
对比观看可以知道,由于内存中数据对齐,成员变量的大小为12。B类的大小也是12,显然此时系统没有计算普通函数的大小,实际上在内存中普通成员函数是不占内存空间的,但是可以看到C类的大小为1,这又是为什么呢?在C++中,类中只有普通函数的情况下,由于类是可以实例化的,内存需要分配一个内存地址来区分该实例化。对于虚函数会建立一个虚函数表,对应的内存中会有一个虚函数指针vptr占用4字节。
实际上对于内存的占用有什么其他不懂的可以直接上代码输出结果就一目了然了。