看了一些关于C++类内存的文章,有了一些粗浅的了解,来做几个小试验检验我自己的认知。
试验用计算机是64位的。
理论上类内存的大小应该是非静态数据成员的大小加上虚指针的大小再考虑内存对齐。先来一个简单的。
class Base{
public:
Base(){}
~Base(){}
private:
int a;
char b;
};
这个类有多大呢,64位机中int为4字节,char为1字节,但这里应该要4字节对齐,因此为4+4=8字节。
稍微搞麻烦一点,这里再定义一个派生类派生自上面的基类。
class Derived: public Base{
public:
Derived(){}
~Derived(){}
private:
static float c;
double d;
};
这个类有多大呢,前面已经说了静态成员是不算的,因此这里只要加上double的8字节就行了,一共是8+8=16字节。
现在再对上述基类和派生类作如下改变。
class Base{
public:
Base(){}
virtual ~Base(){}
private:
int a;
char b;
string* p1;
Base* p2;
};
class Derived: public Base{
public:
Derived(){}
virtual ~Derived(){}
private:
static float c;
double d;
};
现在我把基类析构函数声明成虚函数,在基类中又加了2个指针。因此要算上虚指针的大小,和两个指针的大小。以及64位机中指针大小是8字节,因此基类和派生类的大小变成了32字节和40字节。
注:由于我了解得不深,因此自己也写不出复杂好玩的例子,今后如果想到什么有意思的内容再补充。