C++中类的sizeof大小总结
一.前言:
关键字sizeof的作用是返回对象或类型占用的内存字节数,返回值是size_t。基本数据类型占用的字节数:
字节数 | 类型 |
1字节 | bool 、char |
2字节 | short |
4字节 | int 、float、 long(32位)、指针(32位) |
8字节 | double、long long、指针(64位)、long(64位) |
对sizeof结果的一个重要影响因素是字节对齐。公式:有效对齐值=min(自身对齐值,设置对齐值),每个成员的起始地址得是有效对齐值的倍数,最后地址(占据空间)也是有效对齐值的倍数。
二.类继承:
1.虚函数、虚拟继承均占据4字节,其原因在于,内部均存在表指针指向虚函数表;
2.类中,成员变量占据上表字节数,成员函数不占空间; 注:类至少占据1byte,留有地址待对象化时使用;空基类由编译器优化后,不占据内存大小;
3.继承过程中,子类继承的父类的内存大小,虚拟继承仅占据表指针的4byte大小;
如下例:
#pragma pack(4) //设置对齐值为4 class A { public: void fun1(); // 0 void fun2(); // 0 }; class B : public A{ // 0 public: virtual fun3() = 0; // 4 char b; }; class C : virtual public B{ // 4 public: char c; }; // 纯方法类占据1byte sizeof(A) = 1; // 空基类优化,继承A占据0字节, 虚函数4byte与1byte字节对齐->8 sizeof(B) = 8; // 虚拟继承,包含表指针4byte,c:8,4,1 ->16 sizeof(C) = 16
另外,可采用union节省内存
union只分配域中最大域的空间,即double,所有域共存这个空间
union D { int d1; int d2; char d3; double d4; }; sizeof(D) = 8 // 只分配域中最大域的空间,即double,所有域共存这个空间