深度探索C++對象模型-第三章

說明:

? <u>不是很清楚的點</u>,用下劃線婉烟。

? 解答洼冻,用斜體;

? 重點隅很,用粗體加粗撞牢;

第二章 Data 語意學(xué)

3.2 Data Member 的布局

非靜態(tài)成員變量在class object中的排列順序?qū)⒑推渎暶鞯捻樞蛞粯拥摹5獵++ standard允許編譯器將多個access sections之中的data members自由排列叔营,不必在乎他們的出現(xiàn)在class中的聲明順序屋彪。

3.3 Data Member 的存取

存取代價:

每一個member 的存取許可(private public protected),以及與class的關(guān)聯(lián)绒尊,并不會導(dǎo)致任何空間上或執(zhí)行時間上的額外負(fù)擔(dān)——不論是在個別的class objects 或是在static data member 本身畜挥。

static data members:

靜態(tài)數(shù)據(jù)成員(static data members) 被視為global變量,只有一個實體婴谱,存放在程序的data segment(數(shù)據(jù)段)之中蟹但,每次取static member 就會被內(nèi)部轉(zhuǎn)化為對該唯一的extern 實體的直接參考操作躯泰。若取一個static data member的地址,會得到一個數(shù)據(jù)類型的指針华糖,而不是只想起class member的指針麦向。

nonstatic data members:

只要程序猿在一個成員函數(shù)中直接處理一個非靜態(tài)成員變量,“隱式類對象(this指針)”就會出現(xiàn)客叉。

欲對一個nonstatic data member 進(jìn)行存取操作诵竭,編譯器需要把this指針(class object的起始地址)加上data member的偏移量。

非靜態(tài)成員變量的偏移量在編譯時期就可以獲知兼搏,即使這個成員變量是屬于被派生的類卵慰。因此存取效率高。

3.4 繼承 與 Data Member

class Point2d{
    public:
        //....
    private:
        float x,y;
}
class Point3d{
    public:
        //....
    private:
        float x,y,z;
}

討論上述結(jié)構(gòu)佛呻,與 “提供繼承結(jié)構(gòu)” 有什么不同裳朋?

下面分四種情況討論。

1.只要繼承不要多態(tài)

具體繼承(相對于虛擬繼承)并不會增加空間或存儲時間上的額外負(fù)擔(dān)吓著。這種情況base class和derived class的objects都是從相同的地址開始鲤嫡,其差異只在于derived object 比較大,用以容納自建的靜態(tài)數(shù)據(jù)成員夜矗,把一個derived class object指定給base class 的指針或引用(一定要通過指針或引用)泛范,并不需要編譯器去調(diào)腿门埃或修改地址紊撕,提供了最佳執(zhí)行效率。

2.加上多態(tài)

即在繼承關(guān)系中赡突,提供一個虛函數(shù)接口对扶。

多態(tài)帶來了程序彈性,但這種彈性會帶來空間和存取時間的額外負(fù)擔(dān):

  1. 導(dǎo)入一個虛函數(shù)表 惭缰,用來存儲它所聲明的每一個virtual functions的地址浪南。
  2. 在每一個class object中導(dǎo)入一個vptr,提供執(zhí)行期的鏈接漱受,使每一個object能夠找到相應(yīng)的virtual table络凿。
  3. 加強constructor,使它能夠為vptr設(shè)定初始值昂羡,讓它指向class 所對應(yīng)的virtual table 絮记。
  4. 加強destructor,使它能夠消抹“指向class 相關(guān)virtual table”的vptr虐先。

3.多重繼承

class point2d{
    public:
        //....
    protected:
        float x,y;
}
class Vertex{
    public:
        //....
    protected:
        Vertex *next;
}
class Vertex3d: public point2d, public Vertex{ 
    //point2d是第一個base class怨愤,Vertex是第二個
    public:
        //....
    protected:
        float mumble;
}

對于一個多重派生對象,將其地址指定給“最左端(第一個)base class的指針”蛹批,情況和單一繼承時相同撰洗,因為二者都指向了相同的起始地址篮愉;至于第二個或后面的base class 的地址指定操作,則需要將地址修改過:加上(<u>或減去差导,如果是downcast</u>)介于中間的base class subobject(s)的大小试躏。

如果要存取第二個(或后面)的base class 中的一個data member ,會增加額外的成本嗎柿汛?不需要付出額外的成本冗酿,因為members的位置在編譯時期就固定了,因此存取member只是一個簡單的offset的運算络断。

4.虛擬繼承

這一部分比較難裁替,并且各個編譯器實現(xiàn)方式不同。

class如果含有一個或多個 virtual base class subobjects 將被分割為兩部分:一個不變區(qū)域和一個共享區(qū)域貌笨。

  • 不變區(qū)域中的數(shù)據(jù)弱判,不管后繼如何衍化,總是能有固定的offset锥惋,這部分可以被直接存炔;
  • 至于共享區(qū)域膀跌,所表現(xiàn)的就是virtual base class subobject 遭商,這個部分?jǐn)?shù)據(jù),其位置因為每次派生操作而有變化捅伤,所以只能間接存取劫流。

總結(jié):

虛擬繼承內(nèi)存布局
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丛忆,隨后出現(xiàn)的幾起案子祠汇,更是在濱河造成了極大的恐慌,老刑警劉巖熄诡,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件可很,死亡現(xiàn)場離奇詭異,居然都是意外死亡凰浮,警方通過查閱死者的電腦和手機我抠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袜茧,“玉大人菜拓,你說我怎么就攤上這事”怪埽” “怎么了尘惧?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長递递。 經(jīng)常有香客問我喷橙,道長啥么,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任贰逾,我火速辦了婚禮悬荣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疙剑。我一直安慰自己氯迂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布言缤。 她就那樣靜靜地躺著嚼蚀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪管挟。 梳的紋絲不亂的頭發(fā)上轿曙,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音僻孝,去河邊找鬼导帝。 笑死,一個胖子當(dāng)著我的面吹牛穿铆,可吹牛的內(nèi)容都是我干的您单。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼荞雏,長吁一口氣:“原來是場噩夢啊……” “哼虐秦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起讯檐,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羡疗,失蹤者是張志新(化名)和其女友劉穎染服,沒想到半個月后别洪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡柳刮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年挖垛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秉颗。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡痢毒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚕甥,到底是詐尸還是另有隱情哪替,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布菇怀,位于F島的核電站凭舶,受9級特大地震影響晌块,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜帅霜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一匆背、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧身冀,春花似錦钝尸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剩愧,卻和暖如春踢星,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隙咸。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工沐悦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人五督。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓藏否,卻偏偏與公主長得像公壤,于是被迫代替她去往敵國和親呐赡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容