C++ 有人能解释一下';尺寸';在此代码中

C++ 有人能解释一下';尺寸';在此代码中,c++,padding,packing,C++,Padding,Packing,我不理解下面显示的输出 我知道,无论何时出现虚拟函数,它都会创建一个vptr,但打印的大小仍然超出了我的预期: #include<iostream> using namespace std; class Base { int x; int y; int z; public: virtual void fun(){} virtual void fun2(){} }; class Derived:public Base { public: void fun() ov

我不理解下面显示的输出

我知道,无论何时出现虚拟函数,它都会创建一个
vptr
,但打印的大小仍然超出了我的预期:

#include<iostream>
using namespace std; 

class Base
{
 int x;
 int y;
 int z;
public:
 virtual void fun(){}
 virtual void fun2(){}
};

class Derived:public Base
{
 public:
  void fun() override {} 
};

int main(int argc, char const *argv[])
{
  cout<<sizeof(Base)<<endl;
  cout<<sizeof(Derived)<<endl;
  cout<<sizeof(int)<<endl; 
}
#包括
使用名称空间std;
阶级基础
{
int x;
int-y;
intz;
公众:
虚拟void fun(){}
虚拟void fun2(){}
};
派生类:公共基
{
公众:
void fun()重写{}
};
int main(int argc,char const*argv[]
{

这是一个64位的构建吗?如果是的话,
sizeof Base
将是:

8(vtable指针)+(3*4=12)(成员变量)+4(填充到8字节的倍数) =24

由于
Derived
仅从
Base
派生,并且不添加任何成员变量,因此其大小相同


为什么要添加填充?以保持数组和堆栈中的8字节对齐。为什么这么重要?这是一个。

可能的重复:我认为没有填充发生
sizeof(Base)=sizeof(void*)+sizeof(int)*3
sizeof(void*)对齐
这是8个字节。@hauron哇!谢谢。为什么不呢?应该是什么?@Yksisarvinen敲击“典型”的动作:)