令人困惑的C++对象内存结构图?

令人疑惑的C++对象内存结构图???
请先看以下程序片断,注:32位环境中。

#include "stdafx.h"
#include <iostream>
using namespace std;

//注意:基类中没有虚函数
class Base
{
public:
    ~Base(){}
public:
    int x;
    double y;
};

//注意:派生类中才开始有虚函数
class Derived : public Base
{
public:
    virtual void f(){cout << "Derived::f" << endl; }
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Derived *d = new Derived();
    Base *b = d;   //1处
    cout << (int)b- (int)d << endl;  /////2处,结果竟然是8??????
        
    return 0;
}

如上面的程序,我至少有以下几个疑惑:

1. 按照通常的理解,Derived 是从 Baase派生的,所以d的内存结构应该是:最开始是Base部分,然后是Derived部分,也就是说b和d的地址应该是同一个值(都指向d的起始位置,也就是Base部分),可是为什么实际上二者相差8个字节?

2.从2处的结果来看,d的内存结构中,Base部分似乎是在Derived的后面?因为二者的差为正8。可是按照通常的理解,这种派生结果,开始应该存Base的部分,而后才是Derieved部分,可为什么这个程序中,Base的部分反而存在了Derieved的后面?

3. 我猜测这种基类没有虚函数,而派生类有虚函数的情形,对于d而言,可能是先存派生类虚指针(vPtr),然后再存Base部分,可是虚指针的大小应该是4字节,为什么二者的差却是8?8是怎么计算出来的?
d的内存布局到底是怎么样的?

非常感谢!!
------解决思路----------------------
楼主不要纠结了,那个虚表指针也要对齐的,在你的例子中是按最大的double,8个字节对齐。
你把double改成int,再运行就明白了。
------解决思路----------------------
1.b*,d*不一样这个很好理解,就是因为b没有虚函数,相对d来说少个pvtbl;
2.为什么相差8?因为C/C++要求,在堆和栈上的结构体/C++对象应该是对齐的,结构体对齐的意思是所有成员都是对齐的,所以最大的基本类型是double8字节,malloc和栈上变量一般都是8字节对齐。
假如b和d之间没有4字节的padding,那么d是8字节对齐的,b只能保证是4字节对齐,但是b也应该8字节对齐,因为它也有double,所以需要4字节的padding