VS编译器下类的虚继承的sizeof大小如何算

VS编译器下类的虚继承的sizeof大小怎么算?
#include <iostream>

using namespace std;

class Base1{
  virtual void fun1(){}
  virtual void fun11(){}
public:
virtual ~Base1(){}
};
 
class Base2{
  virtual void fun2(){}
};
 
class DerivedFromOne: virtual public Base2
{
  virtual void fun2(){}
  virtual void fun22(){}
};
 
class DerivedFromTwo: virtual public Base1, virtual public Base2
{
  virtual void fun3(){}
};
 
void main()
{
  Base1 b1;
  Base2 b2;
  DerivedFromOne d1;
  DerivedFromTwo d2;
  cout << "sizeof Base1 " << sizeof(b1) << endl;
  cout << "sizeof Base1 " << sizeof(b2) << endl;
  cout << "sizeof FromOne " << sizeof(d1) << endl;
  cout << "sizeof FromTwo " << sizeof(d2) << endl;
  getchar();
}

结果为:
4
4
12
16

我debug看的变量结构图:


比如d1我看到两个vfptr,怎么就是12呢?

我不明白d1为什么是12,而d2为什么是16,而且若
class DerivedFromTwo: virtual public Base1, public Base2,则
d2是12 ?
我实在是没看明白呀。。

注意是VS编译器,不是GCC编译器,它们的虚继承sizeof结果不同。
请高手赐教。我想了好久了。



------解决方案--------------------
C/C++ code
virtual 继承的时候还有一个虚基类指针,所以d1是 12.

class DerivedFromTwo: virtual public Base1, public Base2
这个是12则说明
Base1和Base2的vptable在DerivedFromTwo的布局中进行了合并,
只使用到了一个指针。
那么有 4(DerivedFromTwo vfptr) + 4(Base1,Base2合并的虚函数指针) + 4( Bass1虚基类指针) = 12,

如果变成:
class DerivedFromTwo: virtual public Base1, virtual public Base2
则sizeof(DerivedFromTwo) = 16 (多加了上个 Base2虚基类指针)

为什么说Base1,Base2的虚函数指针在DerviedFromTwo中合并了呢,
计算下 class DerivedFromTwo: public Base1, public Base2,
sizeof(DerviedFromTwo) = 8就非常明显了。
研究具体编译具细节会让LZ你越发不明白原理,
建议好好研究下《inside c++ ojbect module》