《深度探索C++对象模型》--3 Data语意学
1、Data Member的綁定
(1)“memberrewriting rule”,一個inline函數實體,在整個class聲明未被完全看見之前,是不會被評估求值的。所以通常將inline定義放于類聲明之外。
(2)但是對于argumentlist中的名稱還是會在第一次遭遇時適當地決議。在extern和nestedtype name之間 非直覺綁定操作還是會發生,為了避免此種問題,總是把“nested type name”放于class的起始處。
2、Data member的布局
C++standard,在同一個accesssection(private等)中,members的排列只需符合“較晚聲明的members在classobject中有較高的地址”即可,即members并一定連續排列。
3、Data member的存取
(1)對于staticdata members,存放在程序的datasegment中,不在于classobject中。獲取一個指向其的指針時,會得到一個指向其數據類型的指針。對于不同class的同名staticdata member會采用一種機制來處理。
(2)對于nonstaticdata members,必須與classobject相關聯。當用一個memberfunction 處理nonstaticdata members,會發生“implicitclass object”,即添加this指針。存取時需要在class object的起始地址再加上偏移地址。
4、“繼承”與Data member
(1)多重繼承時,多重派生對象和最左端的base class具有相同的起始地址,至于第二或后續的base class的地址需要加(減)中間的base class subobjects的大小。
5、對象成員的效率
對于關心效率的操作,應該實際測試,而不能推斷,而且某些優化操作不一定進行。
6、指向data members的指針
(1)區分“沒有指向任何data member的指針”和“指向第一個data member的指針”?
每個真正的member offset的值都被加上1,所以編譯器取地址時一般都減1。
(2)取一個nonstatic data member的地址,會得到在class中的offset,而取一個綁定于真正的class object身上的data member的地址,將會得到該member在內存中的真正地址,然后減去offset就會得到。
總結
以上是生活随笔為你收集整理的《深度探索C++对象模型》--3 Data语意学的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一份好的简历应该是这样的(This Is
- 下一篇: 《深度探索C++对象模型》--4 Fun