[toc]
# 类的大小计算
类的大小是指类的实例化对象的大小,用 sizeof
对类型名操作时,结果是该类型的对象的大小
计算原则:
- 遵循结构体的对齐原则
- 与普通成员变量有关,与成员函数和静态成员无关。即普通成员函数,静态成员函数,静态数据成员,静态常量数据成员均对类的大小无影响。因为静态数据成员被类的对象共享,并不属于那个具体的对象。
- 虚函数对类的大小有影响,是因为虚函数表指针的影响
- 虚继承对类的大小有影响,是因为虚基表指针带来的影响
- 空表的大小是一个特殊情况,空类的大小为 1, 当用
new
来创建一个空类的对象时,为了保证不同对象的地址不同,空类也占用存储空间.
# 第一种情况 (无虚函数和虚函数继承)
强调。静态成员变量不会影响类的大小 空类也会占 1 个字节
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include<iostream> using namespace std;
class A{ private: static int s_var; const int c_var; int var; char var1; public: A(int temp) :c_var(temp) {} ~A(){} };
class B{ };
int main(){ A ex1(4); B ex2; cout<<sizeof(ex1) <<endl; cout<<sizeof(ex2) <<endl;
return 0; }
|
# 第二种情况 (有虚表的情况)
Tip:
虚函数的个数并不影响所占内存的大小,因为类对象的内存中只保存了指向虚函数表的指针。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include<iostream> using namespace std;
class A{ private: static int s_var; const int c_var; int var; char var1; public: A(int temp) :c_var(temp) {} ~A(){} virtual void f(){cout<<"A::f"<<endl;} virtual void g(){cout<<"A::g"<<endl;} virtual void h(){cout<<"A::h"<<endl;} };
int main(){ A ex1(4); A *p; cout<<sizeof(p) <<endl; cout<<sizeof(ex1) <<endl; return 0; }
|