#include <iostream> using namespace std; class A { int m_a; int get() { return m_a; } virtual void set(int a) { m_a = a; } virtual int get(int a) { return m_a; } virtual ~A(){} }; class B { }; struct C { }; void main() { cout<<sizeof(A)<<endl; cout<<sizeof(B)<<endl; cout<<sizeof(C)<<endl; }
分析如下:
类所占的空间 = 类成员变量所占空间 + 4(如果存在虚函数的话);
注意:
1、类成员所占的空间可能会涉及到内存数据对齐的问题,需要谨慎考虑;
1)当成员变量的长度都小于处理器位数时,所有成员变量所占的总空间一定是最长的变量所占空间的整数倍;
2)如果某一成员变量长度大于处理器位数,则以处理器的位数为对齐单位;
关于数据对齐,详见:http://blog.csdn.net/tangbo1987/article/details/6766918
2、如果类成员函数不是虚函数,则它不占空间;
3、如果成员函数中存在虚函数,则所有的虚函数保存在虚函数表中,然后类中会有一个指针指向该表;这个指针需要占用空间,所以需要 +4;
此外,空类所占的空间为1字节,因为:“一个类能够实例化,编译器就需给它分配内存空间,来指示类实例的地址;这里编译器默认分配了一个字节(如:char),以便标记可能初始化的类实例,同时使空类占用的空间也最少(即1字节)” --引用 http://blog.csdn.net/sunboy_2050/article/details/6589999
空结构体同理。