前言:
c++ language博大精深狮暑,需要我們透過現(xiàn)象看清本質(zhì)才是正道鸡挠。不積硅步,無以至千里搬男;不積小流拣展,無以成江海。堅持總結(jié)缔逛,堅持寫作瞎惫。下面是對第四周的作業(yè)的總結(jié)。
1. 對象模型圖
2. 內(nèi)存對齊
以下結(jié)果來自vs2017 x86译株。Fruit占32字節(jié)瓜喇,Apple占40字節(jié)。
3. 一些相關(guān)知識點總結(jié)
(1) 數(shù)據(jù)類型所占字節(jié):long int 在windows x64下也是占4個字節(jié)歉糜,windows x64下只有指針會擴展為8字節(jié)乘寒,其他的數(shù)據(jù)類型都和32位下是一致的。
(2) 虛函數(shù)表中虛函數(shù)的地址是按照類中聲明順序排列的匪补,對于派生類沒有覆蓋的虛函數(shù)伞辛,基類的虛函數(shù)地址放在前面烂翰,派生類的虛函數(shù)地址放在后面。對于派生類覆蓋定義的虛函數(shù)蚤氏,則在虛函數(shù)表中甘耿,存放在原來基類中該虛函數(shù)的地址放置的位置上。
(3) 虛函數(shù)表最后有一個結(jié)束節(jié)點竿滨,如果值是0佳恬,那么表示是這個對象的最后一個虛函數(shù)表;如果是1于游,那么表示后面還有虛函數(shù)表毁葱。(這樣設(shè)計應(yīng)該是為了多重繼承,方便查找虛函數(shù)贰剥。如果多個基類含有虛函數(shù)表倾剿,那么派生類對象也會相應(yīng)有多個虛函數(shù)指針,指向各自虛函數(shù)表蚌成。)
(4)多重繼承前痘,派生類的成員函數(shù)放在第一個基類的虛函數(shù)表中,按照聲明順序排列父類担忧。子類的虛函數(shù)會覆蓋相應(yīng)的含有這個虛函數(shù)的各個父類的虛函數(shù)表中的位置际度。
(5)含有虛函數(shù)的類對象有各自的虛函數(shù)表,虛函數(shù)表不共用涵妥,虛函數(shù)共用乖菱。(這樣設(shè)計的好處,之后再思考)
(6) 不同編譯器和操作系統(tǒng)下蓬网,對象的內(nèi)存布局和所占空間大小有所不同窒所。
(7) RTTI在運行時的類型識別,eg, typeid(obj).name() 會返回一個字符串帆锋,表示obj的類型吵取,如class Fruit。不同編譯器返回的字符串會有區(qū)別锯厢。type_info的指針存放在虛函數(shù)表中第一個地址的前面皮官,第一個地址是第一個虛函數(shù)的地址 。兩個運算符:typeid实辑,dynamic_cast.
(8)內(nèi)存對齊捺氢,取類中成員最大占用的大小來對齊。
ps. 時間緊迫剪撬,以后會繼續(xù)補充摄乒。另外c++筆記3中對原型模式的理解很有偏差,后面會做更改。