C++虚继承内存布局-sizeof(类对象)疑惑求解,该怎么解决

C++虚继承内存布局--sizeof(类对象)疑惑求解
C/C++ code

#include<iostream>
using namespace std;
class a
{
  [color=#FF0000]int x;[/color]
  virtual void func(){};
};

class b:public virtual a
{
};

int main(){
  a A;
  b B;
  cout<<sizeof(A)<<endl;
  cout<<sizeof(B)<<endl;
  return 0;
}


以上代码执行结果为:(注:32位系统,G++ 4.3.2)
4
8

C/C++ code

#include<iostream>
using namespace std;
class a
{
  virtual void func(){};
};

class b:public virtual a
{
};

int main(){
  a A;
  b B;
  cout<<sizeof(A)<<endl;
  cout<<sizeof(B)<<endl;
  return 0;
}


但这段代码执行结果却为:
4
4
为什么这跟第一段代码执行结果不相同呢?

------解决方案--------------------
我在vc6.0中运行
第一段代码
8
12
第二段代码
4
8

第一段代码
对象A中有一个虚表指针vptr和int x所以大小为8
对象B中有一个虚基类指针vbptr和一个虚表指针vptr和一个int x所以大小为12

第二段代码
对象A中只有一个虚表指针vptr 所以大小为4
对象B中有一个虚基类指针vbptr和一个虚表指针vptr 所以大小为8

这些都是在vc6.0中结果
有什么不对请指出
------解决方案--------------------
类的大小应该和编译器的实现有关。主要差异反应在虚函数表的那个入口指针的设计上。我知道有两种编译器。有一种会共用虚函数表的入口,这样size 的大小就小 。有些是每个类都有虚函数表(或者是偏移大小),那么每个类根据继承关系就有多个入口指针,这样每继承一层就会多4个size。这种现象主要是要适应强制转换的需要,所以 c++中少写强制转换很重要。
上面的现象我解释的话就是 第一种情况因为定了 成员变量。所以编译器考虑到实现的难度,a和b的类均有一个虚函数表指针,所以我觉得输出应该是 8(4size的成员变量 4size的表指针),12(4size成员变量 2*4 size的表指针,也可能一个4size的表指针,然后是一个4size的记录a虚函数表在b虚函数表中的偏移)
而第二种现象应该是 4,4,第二种现象在有的编译器上也可能是4,8

我说的也可能不对,因为我只是看过一点编译的书籍,凭多年的c++工作猜测。毕竟没有实现过c++编译器。大家探讨一下