深度探索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