#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.是不是正确?
答案 0 :(得分:1)
如您所知,Derived
- 对象有两个vtable指针,我不打算向您解释数据布局。
不匹配的原因很简单:一个指针在32位系统上需要4个字节,在64位系统上需要8个字节(在所有地址空间现在大于可以由32位值处理之后)。
因此我们有:
sizeof(Arr) + sizeof(D1 vptr) + sizeof(D2 vptr)=40+4+4=48
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)
存储中只有少数位实际包含对象所代表的值。