深度探索C++ 对象模型(6)-Data member的存取
生活随笔
收集整理的这篇文章主要介绍了
深度探索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的存取的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 深度探索C++ 对象模型(6)-Data
- 下一篇: 深度探索C++ 对象模型(7)-Data