C 物件模型(三)

2021-05-23 15:34:24 字數 781 閱讀 3622

多重繼承的資料成員布局

這裡解釋了這樣的問題:當乙個類從多個類繼承時,並且這些類可能從其他類中繼承的情況下,類的資料結構如何布局?

答案是,先將基類的成員依次排列,最後放本類的資料成員。

問題是有多個基類,這些基類的順序是怎樣的呢?c++ 標準並沒有定義。但是一般來說,編譯器會把先定義的基類的資料成員放在前面。

由此,寫**的時候,如果需要將派生類轉換為基類型別時,必須注意以下兩點:1、

如果在派生類中,該基類成員排在所有資料最前面,則直接轉換,不需要任何代價;2、

如果在派生類中,該基類成員沒有排在最前面,則編譯器會自動轉換,加上一定的位移。這樣做是有代價的。

虛擬繼承的資料成員布局

當乙個類a 繼承自兩個基類b 、c ,而b 、c 都繼承自同乙個父類d 時,會遇到這樣的問題:類a 中可能有兩個類d 的物件。要解決這個問題,引入了虛擬繼承的概念。

傳統的解決方法是,編譯器對每乙個基類物件加乙個指標。但是,如果繼承鏈過長,會導致指標增多;且類物件的負擔不能固定。

目前的編譯器想到了很多解決的方法來解決這個問題。

微軟用的方法是利用了virtual base class table ,將虛擬基類的指標放在該表中,通過該錶得到指標實現基類的訪問。

solaris 的做法有些不一樣。雖然也是用了virtual base class table ,solaris 巧妙的使用了索引,正索引將訪問到虛函式,而負索引則取到想要的虛擬基類的位移。注意是位移。

最後說明,基於以上的分析,取虛擬基類的資料成員代價是比較高的。最好宣告的虛擬基類沒有任何資料成員。

C 物件模型解析三

複製建構函式的操作 像default constructor一樣 如果乙個class沒有宣告乙個複製建構函式,就會有隱式的宣告出現。跟之前一樣,c 標準會把複製建構函式分為有用的以及無用的,只有有用的例項才會被合成到程式之中,決定乙個copy constructor是否是trivial的標準在於cl...

C 類和物件(三) C 物件模型和this指標

c 中,類的成員變數和成員函式分開儲存。只有非靜態成員變數屬於類的物件,占用物件的記憶體空間。注1 非靜態成員函式和靜態成員 包括靜態成員變數與靜態成員函式 均不屬於類的物件,不占用物件的記憶體空間。注2 非靜態成員函式並非某個物件獨有,記憶體中僅存在乙份資料 乙份函式例項 不同物件的某個非靜態成員...

c 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...