原本是为了看看C++对象模型中子对象赋值给一个父对象和父类型指针指向的域时,到底会不会切割,就打开codebloks写了下面的代码,编译器选的是GNU。
#define DEBUG(X) std::cout<<#X"\t=\t"<<X<<std::endl; class A { public: int a; A():a(1){} }; class B { public: A oa; int b; B():b(2){} }; main() { B ob; A oa;//=ob.oa; int *p = 0; p = (int *)&oa; DEBUG(&ob); DEBUG(&oa); DEBUG(&p); }
发现打印出来的局部变量的地址的排列,从大地址到小地址是:ob,p,oa, 把DEBUG(&p)去掉之后排列又恢复正常了(ob, pa, p)。然后程序放在Linux下用g++编译,出来的结果也是正常的。有大侠知道是怎么回事吗?Windows到底对C++局部变量做了什么?!