我有这段代码:
#include <stdio.h>
class CoolClass
{
public:
virtual void set(int x){x_=x;};
virtual int get(){return x_;};
private:
int x_;
};
class PlainOldClass
{
public:
void set(int x){x_=x;};
int get(){return x_;};
private:
int x_;
};
int main ()
{
printf("CoolClass:\t %ld \nPlainOldClass:\t %ld \n",
sizeof(CoolClass),sizeof(PlainOldClass));
return 0;
}
输出是:
CoolClass: 16
PlainOldClass: 4
我想知道为什么会发生这种情况,我试图找到一些关于虚拟的信息,但我不明白。
非常感谢!
答案 0 :(得分:3)
这是因为具有虚函数的类通常由编译器通过virtual table实现,另请参阅this explanation。并且为了使用这样的虚拟表,它们在内部存储指向表的指针。在您的情况下,CoolClass
的大小由int
成员的大小(通常为4个字节)加上指针的大小(通常为4或8个字节,具体取决于体系结构:32)位vs 64位)。由于填充,你看到16。
答案 1 :(得分:2)
添加virtual
成员函数时,编译器会分配空间来保存指向虚拟表的指针。在您的情况下,指针的大小看起来是8.为了保持对象的对齐为8个字节,编译器将4个字节的填充添加到对象,总共最多16个字节。
如果编译器未添加填充,sizeof(CoolClass)
将为12。
对于第二节课,大小很明显。