带有虚拟参数的C ++ Classes中的sizeof

时间:2015-05-27 18:42:56

标签: c++ class virtual sizeof

我有这段代码:

#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 

我想知道为什么会发生这种情况,我试图找到一些关于虚拟的信息,但我不明白。

非常感谢!

2 个答案:

答案 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。

对于第二节课,大小很明显。