就如《深度探索C++对象模型》一书中介绍的C++的封装并没有给C++带来过多的开销。
好,我们主要看看前面一句。开销是什么,这里的开销主要指C++类所占内存的空间。
首先,我们看这样一个例子,我们定义一个结构体和类,结构体和类中含有相同的数据
1 #include <iostream> 2 using namespace std; 3 4 struct A 5 { 6 int a; 7 int b; 8 int c; 9 }; 10 11 class B 12 { 13 int a; 14 int b; 15 int c; 16 }; 17 18 19 20 int main() 21 { 22 cout<<"sizeof(A)="<<sizeof(A)<<endl; 23 cout<<"sizeof(B)="<<sizeof(B)<<endl; 24 return 0; 25 }
1 #include <iostream> 2 using namespace std; 3 4 struct A 5 { 6 int a; 7 int b; 8 int c; 9 }; 10 11 class B 12 { 13 private: 14 int a; 15 int b; 16 int c; 17 static int d; 18 19 public: 20 static void fun1() 21 { 22 cout<<"This is a static fun1."<<endl; 23 } 24 25 void fun2() 26 { 27 cout<<"This is ordinary fun2."<<endl; 28 } 29 30 virtual void fun3() 31 { 32 cout<<"This is a virtual fun3."<<endl; 33 } 34 }; 35 36 37 38 int main() 39 { 40 cout<<"sizeof(A)="<<sizeof(A)<<endl; 41 cout<<"sizeof(B)="<<sizeof(B)<<endl; 42 return 0; 43 }
在这里我们增加了一个静态数据成员d,一个静态成员函数fun1,非静态的成员函数fun2
一个虚函数fun3.不难发现就类的代码规模来说,的确增加了不少,然而结果仅仅比之前增
加了四个字节的开销。 《深度探索C++对象模型》中有这样一句话说C++封装所带来的开销
1 A *a; 2 a=new A;
1 B *b; 2 b=new B;
1.类的静态数据成员存储在全局变量区,不带来C++内存开销,该静态数据成员属于整个类的
2.类的静态成员函数是属于整个类的,不属于某个对象,不会带来内存开销。注意类的静态成