8

我很难理解以下课程的规模是什么?
我正在使用 MSVS 2008(VC 9.0 编译器)。我已经读过,如果我不声明虚函数(在下面的示例中),那么 D 类将包含 2 个额外的指针(1 个来自 B,另一个来自 C),它将指向 A 的共享实例。

但是在下面的情况下每个类的内存映射是什么(也有虚函数)?

class A
{
public:
    int a;
    virtual void Func();
public:
    A(void);
    ~A(void);
};

class B :virtual public A
{
public:
    int b;
    virtual void Func();
public:
    B(void);
    ~B(void);
};

class C: virtual public A
{
public:
    int c;
    virtual void Func();
public:
    C(void);
    ~C(void);
};

class D : public B, public C
{
public:
    int d;
    virtual void Func();
public:
    D(void);
    ~D(void);
};




int _tmain(int argc, _TCHAR* argv[])
{
    cout << "size of Class A :" << sizeof(A) << endl;

    cout << "size of Class B :" << sizeof(B) << endl;

    cout << "size of Class C :" << sizeof(C) << endl;

    cout << "size of Class D :" << sizeof(D) << endl;

    return 0;
}

输出:
A 类尺寸:8
B 类尺寸:20
C 类尺寸:20
D 类尺寸:32

在这里,如何计算 B、C 和 D 的大小?

编辑:以下是 /d1reportSingleClassLayoutXXX 编译器选项为每个类生成的内存映射:

1>class A size(8):  
1> +---  
1> 0 | {vfptr}  
1> 4 | a  

1>class B size(20):  //Similar for C
1> +---  
1> 0 | {vbptr}  
1> 4 | b  
1> +---  
1>8 | (vtordisp for vbase A)  
1> +--- (virtual base A)  
1>12 | {vfptr}  
1>16 | a  
1> +---  

1>class D size(32):  
1> +---  
1> | +--- (base class B)  
1> 0 | | {vbptr}  
1> 4 | | b  
1> | +---  
1> | +--- (base class C)  
1> 8 | | {vbptr}  
1>12 | | c  
1> | +---  
1>16 | d  
1> +---  
1>20 | (vtordisp for vbase A)  
1> +--- (virtual base A)  
1>24 | {vfptr}  
1>28 | a    

vbase X 的 vtordisp 是什么意思?

4

2 回答 2

1

根据Jonathan Caves,MSFT

它很少使用——但我们必须将它添加到从虚拟基类继承的类中并覆盖虚拟函数,以防用户在构造函数或析构函数中调用虚拟函数。

所以——它是 MSVC 的(非常缺乏文档的)解决方案,用于“在对象构造期间如何进行虚拟调用?”。

于 2014-12-15T16:00:35.807 回答
1

我会说你在一台 32 位机器上,其中sizeof(int)4 是。

推测:

一、A的大小:

|int a (4)|vtable pointer A (4)|

二、B和C的尺寸:

|A base instance (8)|pointer to A(4)|int b/c(4)|vtable pointer B/C|

三、尺寸D:

|A base instance (8)|pointer to A(4)|int c(4)|vtable pointer B(4)|pointer to A(4)|int d(4)|vtable pointer C(4)|

由于D不是从虚拟继承C,它可以承受重用vtable pointer C。同样,这只是猜测。您应该尝试转储对象 D 的内存以确定。而且我不确定您的机器如何对齐内存。

于 2014-02-28T09:57:44.280 回答