C++对象的内部结构及实现和编译器紧密相关.这里主要介绍Windows下的VC++和GNU的gcc编译器.
- 简单对象. C++对象中包含成员数据和成员函数.其中成员数据分为静态成员数据和非静态成员数据.成员函数分为静态成员函数,非静态成员函数和虚函数.
class simpleClass //由sizeof得到该对象是12个字节.
{
public:
static int nCount;//存放在全局静态存储区中,不作为对象占据内存的一部分
int nValue;//在对象占据的内存中,4字节
char c;//1字节,而在32位计算机上为了提高效率,使之4字节对齐,故占据4字节.
simpleClass();
virtual ~simpleClass();//C++在碰到含有虚函数的类时,会分配一个指针指向一个函数地址表:虚函数表,占据4字节.
virtual void foo();
int getvalue();//对于静态成员函数和非静态成员函数,C++编译器采用和普通C函数类似的方法进行编译,只不过对函数名进行了名称修饰,用来支持重载,并且在参数列表中增加了一个this指针,用来表明是哪一个对象调用了该函数.因此静态成员函数和非静态成员函数的多少对对象的大小没有影响.
static void addCount();
};
由上分析,可得出以下结论:
1 . 非静态数据成员是影响对象占据内存的主要因素,
2 . 所有对象共享一份静态数据成员.
3 . 静态成员函数和非静态成员函数不影响对象内存的大小,虽然其实现会占据相应的内存空间.
4. 如果对象包含虚函数, 会增加4个字节的空间,不论有多少个虚函数.