问题:

  考察了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 ;
}

1)选择类文件上右键属性:

c++类的内存布局-LMLPHP

2)先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),

则只会打出指定类XXX的内存布局。近期的VS版本都支持这样配置。

c++类的内存布局-LMLPHP

3)看到结果:

c++类的内存布局-LMLPHP

结果分析:

  因为static_cast提供了更加安全的静态类型转换,将C类型的地址使用B类型指向后,会在原来C的地址基础上便宜4个字节刚好是B类型的地址。

  However,reinterpret_cast提供的是不安全的类型装换,它仅仅是把c的地址copy了一下,就强行复制给B类型的指针了。

05-26 09:22