为什么尺寸48而不是44?

时间:2017-09-28 03:56:28

标签: c++

#include <iostream>  
using namespace std;  
class B{ int arr[10];  
};  
class D1: virtual public B{  
};  
class D2: virtual public B{
};  
class Derived: public D1,public D2{};  
int main()  {  
  cout  <<  sizeof(D1)  <<  endl; 
  cout  << sizeof(Derived)  <<  endl;   
}

输出为48和56。 Sizeof(Derived)= Sizeof(Arr)+ Sizeof(D1 vptr)+ Sizeof(D2 vptr)= 40 + 4 + 4 = 48.是不是正确?

2 个答案:

答案 0 :(得分:1)

如您所知,Derived - 对象有两个vtable指针,我不打算向您解释数据布局。

不匹配的原因很简单:一个指针在32位系统上需要4个字节,在64位系统上需要8个字节(在所有地址空间现在大于可以由32位值处理之后)。

因此我们有:

  • 32位:sizeof(Arr) + sizeof(D1 vptr) + sizeof(D2 vptr)=40+4+4=48
  • 64位:sizeof(Arr) + sizeof(D1 vptr) + sizeof(D2 vptr)=40+8+8=56

类似于D1

答案 1 :(得分:-1)

类的运行时大小是依赖于实现(即编译器)的。看看这个tutorial。实施决定尺寸取决于许多因素,例如处理器位中的位数,对象的顺序,虚函数,基类等。

该标准涉及班级object representation and its value representation

对象代表

sizeof(T)为您提供对象表示的大小。

VALUE REPRESENTATION

整个sizeof(T)存储中只有少数位实际包含对象所代表的值。