空类及其他不含成员变量类的内存分析
有一种奇葩的类叫做空类。很显然,它没有任何作用,甚至对于学习C++都没有任何用处。但是,研究它的内存大小,我却从中发现了一些东西,那是平常我们注意不到的。
创建一个空类testA,输出sizeof(testA)的结果。既然是空类,内存大小应该是0才对。但是看一眼黑色控制台:1。1?为什么是1?百度给我答案:这是每个实例化的类都需要的,总是需要在内存里占用一些东西。这样,大多数实现都会加入一个类似于占位符的隐藏字节,于是乎,答案即为1。如果在类中加入一些成员函数呢?尝试了一下,发现内存仍然是1。(成员函数本来就不应该占用内存啊…)
接下来是一个包含着虚函数的类,testB。其中包含有一个虚函数hello()。输出sizeof(b),答案是4。这个答案,大多数C++书在讨论虚函数的时候已经做了详尽的解释。其内存占用源于4B的虚函数表(V-Teble)指针vptr。
接下来,是一个比较令人惊讶的类:
class testC{ public: char buffer[0]; };
其中包含一个长度为0的数组buffer,它不占用任何内存。但是,既然是空类,就要占用1B。然而,我创建了一个包含100个testC的数组。发现它们的地址都是相同的(在G++下编译,VC编译器会报错)。这或许是因为G++对数组基址的优化造成的,因为倘若去掉buufer数组,使其成为一个空类,反而会导致每个类的地址不同。
空类很有意思,至少在大小方面。但是其作用,思索半天,也只有占位,使代码能在尚未成型下成功编译罢了。当然,最后那个0数组的例子,它还可以充当一个不占内存空间的指针,实现动态内存分配。


浙公网安备 33010602011771号