c++类的内存布局
问题:
考察了reinterpret_cast和static_cast的区别。顺道发现了一个可以查看c++内存布局的工具(在VS中)。
结果:
前两个输出的地址形同,后一个不同。
class A{int m;}; class B{int m;}; class C: public A, public B{}; C c; int main() { printf("%p, %p, %p", &c, reinterpret_cast<B*>(&c), static_cast <B*>(&c)); return 0; }
1)选择类文件上右键属性:
2)先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),
则只会打出指定类XXX的内存布局。近期的VS版本都支持这样配置。
3)看到结果:
结果分析:
因为static_cast提供了更加安全的静态类型转换,将C类型的地址使用B类型指向后,会在原来C的地址基础上便宜4个字节刚好是B类型的地址。
However,reinterpret_cast提供的是不安全的类型装换,它仅仅是把c的地址copy了一下,就强行复制给B类型的指针了。