问题:

  考察了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)选择类文件上右键属性:

c++类的内存布局

 

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

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

c++类的内存布局

3)看到结果:

 c++类的内存布局

结果分析:

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

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

 

相关文章:

  • 2021-10-03
  • 2022-03-08
  • 2021-12-13
  • 2021-08-11
  • 2021-05-16
  • 2021-12-07
  • 2022-12-23
  • 2021-10-28
猜你喜欢
  • 2022-12-23
  • 2021-08-20
  • 2021-09-01
  • 2022-01-18
  • 2021-06-13
  • 2021-12-05
相关资源
相似解决方案