有关C++类虚继承内存分配有关问题

有关C++类虚继承内存分配问题
#include <iostream>
using namespace std;

class A
{

private:
char a;
};

class B : public virtual A
{

private:
char b;

};

void main(void)
{
cout<<"The volume of A is "<<sizeof(A)<<endl;
cout<<"The volume of B is "<<sizeof(B)<<endl;




结果为:1  和  9

请问,虚继承的时候,在派生类中,是不是按照下列内存分布的:指向虚基类指针(4字节)+派生类变量(1字节+3字节对齐内存)+虚基类变量(1字节)分布的?如果是,那么类的总体字节对齐计算的时候并没有按指向虚基类指针的长度(即4字节)对齐,因为,class B的总长为9,不是4的整数倍。这是不是意味着指向虚基类指针不对类整体内存对方对齐约束?


------解决方案--------------------
http://blog.csdn.net/wxc1987821/article/details/5958325
------解决方案--------------------
引用:
#include <iostream>
using namespace std;

class A
{

private:
char a;
};

class B : public virtual A
{

private:
char b;

};

void main(void)
{
cout<<"The volume of A ……

第一个问题:请问,虚继承的时候,在派生类中,是不是按照下列内存分布的:指向虚基类指针(4字节)+派生类变量(1字节+3字节对齐内存)+虚基类变量(1字节)分布的?
答案是不确定。这是属于编译器具体实现层次上的东西,各家编译器可以使用完全不同的次序来排列这三者,放置位置也可能不同。例如,当前较新的g++都会压缩B,将A和B中的两个char放到连续空间中,从而B最终大小只有8字节。微软的vc好像是这么处理的。另外,要支持虚拟继承的方式也很多,你甚至都不能假设一定有一个指向虚基类的指针,因为将虚基类的偏移量存放到虚函数表中也是一种可行的技术。

第二个问题:如果是,那么类的总体字节对齐计算的时候并没有按指向虚基类指针的长度(即4字节)对齐,因为,class B的总长为9,不是4的整数倍。这是不是意味着指向虚基类指针不对类整体内存对方对齐约束?
感觉上是应该对齐来着,但我也不知道为什么vc会这么处理。。以前没有看到过相关的资料。
如果设置pack(2),那么sizeof(B)为7,如果设置pack(1),那么sizeof(B)为6。