看之前的疑問:
1.既然基類先於派生類初始化,基類的資料成員與派生類的資料成員是如何放置的?
筆記:
1.當初始化乙個類時,如果裡面沒有任何成員,那麼大小為1,編譯器這麼做的原因是為了讓每乙個物件都能保證獲得獨一無二的記憶體位址;
2.在某些編譯器上,當類中沒有資料成員,但是卻存在虛函式時,那麼一些編譯器(比如vs)會把預設安插的乙個位元組優化掉,那麼類的大小就是虛函式指標的大小。
3.當乙個基類變成虛基類時,那麼它在乙個繼承體系中只會存在乙個實體(編譯器這麼做的原因是為了防止二義性和節省記憶體空間。
4.當兩個類中都含有相同名字的靜態成員時,編譯器會分別再建立乙個別名;
觀後感:
1.既然空虛基類被視為派生類的最開頭的一部分,但是又只有乙個實體,那麼在書中使用的class a所產生的實體是在哪個派生類那裡呢?是在class y, class z還是派生類class a?
《深度探索C 物件模型》第三章 Data語意學
首先給出以下例子 y,z的記憶體大小受三個因素的影響 1.語言本身造成的額外負擔,指的是虛繼承中在類中會產生乙個指向虛表的指標,這個指標在32位的系統下是4個位元組。2.編譯器對特殊情況提供的優化處理。3.alignment限制。class a的大小由以下幾點決定 1.被共享的 class x,為1...
深度探索C 物件模型 第三章 Data 語意學
乙個有趣的問題 下列 類 sizeof大小 class x 1 class y public virtual x 4 or 8 class z public virtual x 4 or 8 class a public y,public z 8 or 12 主要原因 為了保持每乙個類生成物件在記憶...
《深入探索C 物件模型》第三章奇怪語句解釋
在第三章的3.3節有下面這樣一段描述 class point3d point3d origin origin.y 0.0 origin point3d y 1 對於 1 的操作解釋是這樣的 指向data member的指標,其offset值總是被加上1,這樣可以使編譯系統區分出 乙個指向data m...