首先,sizeof是一个操作符。
其作用是返回一个对象或类型所占的内存字节数。
其返回值为 size_t,依赖于编译系统的值,一般定义为 typedef unsigned int size_t。
32位机下:
# include <iostream>
using namespace std;
//空类大小
class Empty{};
class Son : public::Empty{};
//静态成员函数和静态成员
class Sfun {
public:
static int a;
int b;
};
//虚函数
class Fun {
public:
virtual void fun() {};
};
class MoreFun {
public:
virtual void fun1() {};
};
class BestFun :virtual public::Fun, virtual public::MoreFun {
public:
virtual int B() {};
};
//普通继承
class A {
public:
char a0;
int a1;
};
class B :public::A {
public:
int b0;
};
int main() {
//空类大小
cout << "空类和空类的大小:" << endl;
cout << sizeof(Empty) << endl;
cout << sizeof(Son) << endl;
//静态成员函数和静态成员
cout << "静态成员大小:" << endl;
cout << sizeof(Sfun) << endl;
//虚函数
cout << "虚函数大小:" << endl;
cout << sizeof(Fun) << endl;
//多个虚函数
cout << "多个虚函数大小:" << endl;
cout << sizeof(MoreFun) << endl;
//虚函数继承
cout << "虚函数继承大小:" << endl;
cout << sizeof(BestFun) << endl;
//普通继承
cout << "普通继承:" << endl;
cout << sizeof(B) << endl;//12 5+1+4 ----内存对齐12
cin.get();
return 0;
}
总结:
- 空类的大小为1字节
- 一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间。
- 对于包含虚函数的类,不管有多少个虚函数,只有一个虚指针,vptr的大小。
- 普通继承,派生类继承了所有基类的函数与成员,要按照字节对齐来计算大小
- 虚函数继承,不管是单继承还是多继承,都是继承了基类的vptr。(32位操作系统4字节,64位操作系统 8字节)!
- 虚继承,继承基类的vptr。