欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

深度探索C++ 对象模型(6)-Data member的存取

发布时间:2025/3/21 c/c++ 38 豆豆
生活随笔 收集整理的这篇文章主要介绍了 深度探索C++ 对象模型(6)-Data member的存取 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
  • nonstatic data member

需要在class object起始地址加上该member的偏移。

class A {public: int x; int y;}; A a; a.y = 0; //等价于&a.y = &a + &A::y
  • static data member

取一个static member的地址,会得到指向该数据类型的指针,而不是指向class member的指针

  • 总结

在如下代码中:

class Point3d { public:float x;static list<Point3d*>* freeList;float y;static int chunkSize;float z; }; int Point3d::chunkSize = 0;Point3d origin; Point3d *pt = &origin; // 通过寻址进行存取 origin.x = 0.0F; // 等价于 *(&origin + (&Point3d::x - 1)) = 0.0; pt->x = 0.0F; // 等价于 *(pt + (&Point3d::x - 1)) = 0.0;origin.chunkSize = 1; // 编译器会转化为Point3d::chunkSize = 1; pt->chunkSize = 2; // 编译器会转化为Point3d::chunkSize = 2;
  • 对于nonstatic data member, 如果存取的是一个从virtual base class继承下来的member,使用指针或者引用存取,由于不知道该指针或者引用的动态类型,因此存取操作必须延迟到运行期,经过一个额外的导引才能解决

  • 对于static data member, 如果两个classes每一个都声明了一个static member freeList,都存放在data segment,就会导致名字冲突,解决办法就是name-mangling,得到独一无二的名称


【引用】
[1]: <<深度探索C++ 对象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 译
[2]: 代码地址 https://github.com/thefistlei/cplusStudy.git

总结

以上是生活随笔为你收集整理的深度探索C++ 对象模型(6)-Data member的存取的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。