最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解C++的對(duì)象模型

 更新時(shí)間:2016年08月11日 09:42:25   作者:?jiǎn)蔚锻炼? 
本文在介紹C++使用的對(duì)象模型之前,先介紹了2種對(duì)象模型:簡(jiǎn)單對(duì)象模型(a simple object model)和表格驅(qū)動(dòng)對(duì)象模型(a table-driven object model),這樣介紹對(duì)后面的內(nèi)容更有幫助,有需要的小伙伴們可以參考學(xué)習(xí)。

何為C++對(duì)象模型?

C++對(duì)象模型可以概括為以下2部分:

     1. 語(yǔ)言中直接支持面向?qū)ο蟪绦蛟O(shè)計(jì)的部分

     2. 對(duì)于各種支持的底層實(shí)現(xiàn)機(jī)制

引言

現(xiàn)在有一個(gè)Point類,聲明如下:

class Point {
 public:
 Point(float xval);
 virtual ~Point();

 float x() const;
 static int PointCount();

 protected:
 virtual ostream& print(ostream &os) const;

 float _x;
 static int _point_count;
};

這個(gè)類在機(jī)器上是通過(guò)什么模型來(lái)表示的呢?下面就介紹三種不同的實(shí)現(xiàn)方式。

1. 簡(jiǎn)單對(duì)象模型

簡(jiǎn)單對(duì)象模型名副其實(shí),十分簡(jiǎn)單。在簡(jiǎn)單對(duì)象模型中,一個(gè) object是由一系列slots組成,每個(gè)slot相當(dāng)于一個(gè)指針,指向一個(gè)membermemebers按照聲明的順序與slots一一對(duì)應(yīng),這里的members括data membersfunction members

如果將簡(jiǎn)單對(duì)象模型應(yīng)用在Point Class上,結(jié)構(gòu)圖如下:

優(yōu)點(diǎn):十分簡(jiǎn)單,降低了編譯器設(shè)計(jì)的復(fù)雜度。

缺點(diǎn):空間和時(shí)間上的效率降低。由于所有member都對(duì)應(yīng)一個(gè)slot指針,所以每個(gè)object在空間上額外多出:member's number 乘以指針大小的空間。同時(shí)由于訪問(wèn)object的每個(gè)member都需要一次slot的額外索引,所以在時(shí)間的效率也會(huì)降低。

2. 表格驅(qū)動(dòng)對(duì)象模型

表格驅(qū)動(dòng)對(duì)象模型將member datamember function分別映射成兩個(gè)表格member data tablefunction member table,而object本身只存儲(chǔ)指向這兩個(gè)表格的指針。 其中function member table是由一系列的slot組成,每個(gè)slot指向一個(gè)member function; member data table則直接存儲(chǔ)的member data本身。如果將表格驅(qū)動(dòng)對(duì)象模型應(yīng)用在Point Class上,結(jié)構(gòu)圖如下:

優(yōu)點(diǎn):采用兩層索引機(jī)制,對(duì)object變化提供比較好的彈性,在objectnonstatic data member有所改變時(shí),而應(yīng)用程序代碼沒(méi)有改變,這時(shí)是不需要重新編譯的。

缺點(diǎn):空間和時(shí)間上的效率降低,具體原因可以參考簡(jiǎn)單對(duì)象模型的缺點(diǎn)分析。

3. C++ 對(duì)象模型

Stroustrup 早期設(shè)計(jì)的C++對(duì)象模型是從簡(jiǎn)單對(duì)象模型改進(jìn)而來(lái)的,并對(duì)內(nèi)存空間和存取時(shí)間進(jìn)行了優(yōu)化。主要是將nonstatic data members存儲(chǔ)在每一個(gè)object中,而static data members以及所有的function members被獨(dú)立存儲(chǔ)在所有object之外。

對(duì)虛函數(shù)的支持主要通過(guò)以下幾點(diǎn)完成的:

     所有包含虛函數(shù)或者繼承自有虛函數(shù)基類的class都會(huì)有一個(gè)virtual table,該虛函數(shù)表存儲(chǔ)著一堆指向該類所包含的虛函數(shù)的指針。

     每個(gè)class所關(guān)聯(lián)的type_info object也是由virtual table存儲(chǔ)的,一般會(huì)存在該表格的首個(gè)slot,type_info用于支持runtime type identification (RTTI)。

如果將C++對(duì)象模型應(yīng)用在Point Class上,結(jié)構(gòu)圖如下:

優(yōu)點(diǎn):空間和存取效率高,所有static data members以及所有的function members被獨(dú)立存儲(chǔ)在所有object之外,可以減少每個(gè)object的大小,而nonstatic data members存儲(chǔ)在每一個(gè)object中,又提升了存取效率。

缺點(diǎn):如果應(yīng)用程序的代碼未曾更改,但所用到的classnonstatic data members有所更改,那么那些代碼仍然需要全部重新編譯,而前面的表格驅(qū)動(dòng)模型在這方面提供了較大的彈性,因?yàn)樗嗵峁┝艘粚娱g接性,當(dāng)然是付出了時(shí)間和空間上的代價(jià)。

在加上繼承情況下的對(duì)象模型

C++支持單繼承、多繼承、虛繼承,下面來(lái)看下base class實(shí)體在derived class中是如何被構(gòu)建的。

簡(jiǎn)單對(duì)象模型中可以通過(guò)derived class object中的一個(gè)slot來(lái)存儲(chǔ)base class subobject的地址,這樣就可以通過(guò)該slot來(lái)訪問(wèn)base class的成員。這種實(shí)現(xiàn)方式的主要缺點(diǎn)是:因?yàn)殚g接性的存儲(chǔ)而導(dǎo)致空間和存取時(shí)間上存在額外負(fù)擔(dān);優(yōu)點(diǎn)是:derived class的結(jié)構(gòu)不會(huì)因?yàn)?code>base class的改變而改變。

表格驅(qū)動(dòng)對(duì)象模型中可以利用一個(gè)類似base class table的表格來(lái)存儲(chǔ)所有基類的信息。該表格中存儲(chǔ)一系列slot,每個(gè)slot存儲(chǔ)一個(gè)base class的地址。這種實(shí)現(xiàn)方式的缺點(diǎn)是:因?yàn)殚g接性的存儲(chǔ)而導(dǎo)致空間和存取時(shí)間上存在額外負(fù)擔(dān);優(yōu)點(diǎn)是:一是所有繼承的class都有一致的表現(xiàn)形式(包含一個(gè)base table指針,指向基類表)與基類的大小和數(shù)目沒(méi)有關(guān)系,二是base class table增加了子類的擴(kuò)展性,當(dāng)基類發(fā)生改變時(shí),可以通過(guò)擴(kuò)展、縮小或者更改base class table來(lái)進(jìn)行調(diào)整。

以上兩種實(shí)現(xiàn)方式都存在一個(gè)重要的問(wèn)題,就是由于間接性而導(dǎo)致的空間和時(shí)間上的額外負(fù)擔(dān),并且該間接性的級(jí)數(shù)會(huì)隨著繼承的深度而增加。

C++ 最初采用的繼承模型并不采用任何間接性,所有基類的數(shù)據(jù)直接存儲(chǔ)在子類當(dāng)中,這樣在存儲(chǔ)結(jié)構(gòu)和訪問(wèn)效率上是最高效的。當(dāng)然也有缺點(diǎn):當(dāng)base class members有任何改變,用到此base class或者derived class的對(duì)象必須重新編譯。在C++ 2.0引入了virtual base class,需要一些間接性的方式來(lái)支持該特性,一般會(huì)導(dǎo)入一個(gè)virtual base class table或者擴(kuò)展已有的virtual table。

總結(jié)

以上就是深入研究C++的對(duì)象模型的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家有所幫助。

相關(guān)文章

  • 淺談c語(yǔ)言中類型隱性轉(zhuǎn)換的坑

    淺談c語(yǔ)言中類型隱性轉(zhuǎn)換的坑

    下面小編就為大家?guī)?lái)一篇淺談c語(yǔ)言中類型隱性轉(zhuǎn)換的坑。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(文件版)

    C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(文件版)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++ 使用VS Code運(yùn)行程序時(shí)終端輸出中文亂碼的解決辦法

    C++ 使用VS Code運(yùn)行程序時(shí)終端輸出中文亂碼的解決辦法

    這篇文章主要介紹了C++ 使用VS Code運(yùn)行程序時(shí)終端輸出中文亂碼的解決辦法 ,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • C++鏈表實(shí)現(xiàn)通訊錄管理系統(tǒng)

    C++鏈表實(shí)現(xiàn)通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++鏈表實(shí)現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 在C++中實(shí)現(xiàn)高效的數(shù)組原地輪轉(zhuǎn)的方法總結(jié)

    在C++中實(shí)現(xiàn)高效的數(shù)組原地輪轉(zhuǎn)的方法總結(jié)

    在 C++ 中,可以通過(guò)多種方式實(shí)現(xiàn)數(shù)組的輪轉(zhuǎn)操作,以下是幾種常見(jiàn)的實(shí)現(xiàn)方法及其對(duì)應(yīng)的代碼示例,文中通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2025-04-04
  • C++中的常對(duì)象與常對(duì)象成員詳解

    C++中的常對(duì)象與常對(duì)象成員詳解

    常成員函數(shù)可以訪問(wèn)常對(duì)象中的數(shù)據(jù)成員,但仍然不允許修改常對(duì)象中數(shù)據(jù)成員的值。有時(shí)在編程時(shí)有要求,一定要修改常對(duì)象成員中的某個(gè)數(shù)據(jù)成員的值(例如類中有一個(gè)用于計(jì)數(shù)的變量count,其值應(yīng)當(dāng)不能變化)
    2013-10-10
  • Qt中暫停程序的幾種方法小結(jié)

    Qt中暫停程序的幾種方法小結(jié)

    本文主要介紹了Qt中暫停程序的幾種方法小結(jié),包含了4種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • C語(yǔ)言實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲

    C語(yǔ)言實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++聯(lián)合體union用法實(shí)例詳解

    C++聯(lián)合體union用法實(shí)例詳解

    這篇文章主要介紹了C++聯(lián)合體union用法,較為詳細(xì)的分析了C++中聯(lián)合體的概念、實(shí)用技巧及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2015-05-05
  • OpenCV利用對(duì)比度亮度變換實(shí)現(xiàn)水印去除

    OpenCV利用對(duì)比度亮度變換實(shí)現(xiàn)水印去除

    OpenCV中去除水印最常用的方法是inpaint,通過(guò)圖像修復(fù)的方法來(lái)去除水印。本文將介紹另一種方法:利用對(duì)比度亮度變換去除水印,需要的朋友可以參考一下
    2021-11-11

最新評(píng)論

巫山县| 大城县| 阿鲁科尔沁旗| 静海县| 伊宁市| 岐山县| 九江市| 昌黎县| 安平县| 呼伦贝尔市| 三江| 县级市| 寻甸| 古蔺县| 沂源县| 麟游县| 新郑市| 永川市| 岳阳市| 新河县| 宝鸡市| 阳曲县| 图木舒克市| 文水县| 柘城县| 九台市| 富蕴县| 文安县| 纳雍县| 称多县| 探索| 东阿县| 靖边县| 江西省| 渭南市| 贺州市| 巫山县| 疏附县| 长垣县| 武强县| 华安县|