带有虚形参的c++类中的sizeof差异

Difference sizeof in C++ Classes with virtual parameter

本文关键字:sizeof 差异 c++ 形参      更新时间:2023-10-16

我有这样的代码:

#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 

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

非常感谢!

发生这种情况是因为具有虚函数的类通常由编译器通过虚表实现,另见此解释。为了使用这样的虚表,它们在内部存储一个指向表的指针。在您的示例中,CoolClass的大小由int成员的大小(通常为4字节)加上指针的大小(通常为4或8字节,具体取决于体系结构:32位vs 64位)给出。

当添加virtual成员函数时,编译器会分配空间来存放指向虚表的指针。在您的例子中,指针的大小看起来是8。为了保持对象的对齐长度为8字节,编译器为对象添加了4个字节的填充,总共16个字节。

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

对于第二类,大小是明显的。