前言:
c++ language博大精深,需要我們透過現象看清本質才是正道。不積矽步,無以至千里;不積小流,無以成江海。堅持總結,堅持寫作。下面是對第四周的作業的總結。
1. 物件模型圖
圖1 物件模型圖
2. 記憶體對齊
圖2 fruit
3. 一些相關知識點總結
(1) 資料型別所佔位元組:long int 在windows x64下也是佔4個位元組,windows x64下只有指標會擴充套件為8位元組,其他的資料型別都和32位下是一致的。
(2) 虛函式表中虛函式的位址是按照類中宣告順序排列的,對於派生類沒有覆蓋的虛函式,基類的虛函式位址放在前面,派生類的虛函式位址放在後面。對於派生類覆蓋定義的虛函式,則在虛函式表中,存放在原來基類中該虛函式的位址放置的位置上。
(3) 虛函式表最後有乙個結束節點,如果值是0,那麼表示是這個物件的最後乙個虛函式表;如果是1,那麼表示後面還有虛函式表。(這樣設計應該是為了多重繼承,方便查詢虛函式。如果多個基類含有虛函式表,那麼派生類物件也會相應有多個虛函式指標,指向各自虛函式表。)
(4)多重繼承,派生類的成員函式放在第乙個基類的虛函式表中,按照宣告順序排列父類。子類的虛函式會覆蓋相應的含有這個虛函式的各個父類的虛函式表中的位置。
(5)含有虛函式的類物件有各自的虛函式表,虛函式表不共用,虛函式共用。(這樣設計的好處,之後再思考)
(6) 不同編譯器和作業系統下,物件的記憶體布局和所佔空間大小有所不同。
(7) rtti在執行時的型別識別,eg, typeid(obj).name() 會返回乙個字串,表示obj的型別,如class fruit。不同編譯器返回的字串會有區別。type_info的指標存放在虛函式表中第乙個位址的前面,第乙個位址是第乙個虛函式的位址 。兩個運算子:typeid,dynamic_cast.
(8)記憶體對齊,取類中成員最大占用的大小來對齊。
ps. 時間緊迫,以後會繼續補充。另外c++筆記3中對原型模式的理解很有偏差,後面會做更改。
型別記憶體模型(物件記憶體模型)
型別的記憶體模型的3個問題 1 包含什麼 附加資訊 2 怎麼布局 記憶體對齊 3 使用場景 怎麼使用附加資訊 除了包含結構型別的顯式成員變數外,型別記憶體模型需要解決附加資訊的引入問題 1 附加資訊 opaque 有哪些 型別資訊 函式資訊 繼承資訊 記憶體計數等 2 為什麼有附加資訊 1 解決多型...
物件記憶體模型
物件物件模型 物件在記憶體是如何存放的 存放規則 1.class記憶體對齊規則和struct相同。2.class 成員函式和成員變數分開存放,每個物件有獨享的成員變數 堆疊全域性資料 同一類的所有物件共享同一成員函式 段 3.呼叫成員函式時將物件位址傳遞給成員函式 隱式傳遞 成員函式通過物件位址 t...
python物件記憶體模型
首先介紹一下python物件的記憶體模型,如下圖1所示 圖1.pyobject物件記憶體模型 上圖可以看到,乙個pyobject必須包含ob refcnt和ob type 這兩個屬性 ob refcnt是這個物件的引用計數,而ob type則是指向 typeobject結構體的指標,它是python...