C++ 类 与虚拟参数的差异 sizeof

Difference sizeof in C++ Classes with virtual parameter

我有这个代码:

#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 

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

非常感谢!

发生这种情况是因为具有虚函数的 类 通常由编译器通过 virtual table, see also this explanation 实现。为了使用这样的虚拟 table,它们在内部存储了一个指向 table 的指针。在您的情况下,CoolClass 的大小由 int 成员的大小(通常为 4 个字节)加上指针的大小(通常为 4 或 8 个字节,具体取决于体系结构:32位与 64 位)。由于填充,您看到 16。

添加 virtual 成员函数时,编译器会分配 space 来保存指向虚拟 table 的指针。在您的情况下,指针的大小看起来是 8。为了将对象的对齐保持在 8 个字节,编译器向对象添加 4 个字节的填充,总共 16 个字节。

如果编译器没有添加填充,sizeof(CoolClass) 会是 12。

第二个class,大小很明显