#include <iostream> using namespace std; class A { }; class B { char ch; void func() { } }; class C { char ch1; //占用1字节 char ch2; //占用1字节 virtual void func() { } }; class D { int in; virtual void func() {} }; int main() { A a; B b; C c; D d; cout << sizeof(a) << endl;//result=1 cout << sizeof(b) << endl;//result=1 cout << sizeof(c) << endl;//result=8 cout << sizeof(d) << endl;//result=8 }
1 2 3 | class A { }; cout<<sizeof(A)<<endl;//1 |
注:class A是一个空类型,它的实例不包含任何信息,本来求sizeof应该是0。
但当我们声明该类型的实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 | class B { public: B() {} ~B() {} }; cout<<szieof(B)<<endl;//1 |
注:class B在class A的基础上添加了构造函数和析构函数。
由于构造函数和析构函数的调用与类型的实例无关(调用它们只需要知道函数地址即可),在它的实例中不需要增加任何信息。
所以sizeof(B)和sizeof(A)一样,在Visual Studio 2008中都是1。
1 2 3 4 5 6 7 8 9 10 11 12 13 | class C { public: C() {} virtual ~C() {} }; cout<<sizeof(C)<<endl;//4 |
注:class C在class B的基础上把析构函数标注为虚拟函数。C++的编译器一旦发现一个类型中有虚拟函数,
就会为该类型生成虚函数表,并在该类型的每一个实例中添加一个指向虚函数表的指针。
在32位的机器上,一个指针占4个字节的空间,因此sizeof(C)是4。
C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1。
如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,
在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键。而虚函数本身和其他成员函数一样,是不占用对象的空间的。
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 | class D { char ch; void func() { } }; class E { char ch1; //占用1字节 char ch2; //占用1字节 virtual void func() { } }; class F { int in; virtual void func() { } }; cout << "D的大小"<< sizeof(D) << endl;//1 cout << "E的大小" << sizeof(E) << endl;//8 cout << "F的大小" << sizeof(E) << endl;//8 |