深度探索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
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值