欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當前位置:主頁 > 軟件編程 > C語言 >

深入理解C++的對象模型

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊: 次

何為C++對象模型?

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

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

     2. 對于各種支持的底層實現(xiàn)機制

引言

現(xiàn)在有一個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;
};

這個類在機器上是通過什么模型來表示的呢?下面就介紹三種不同的實現(xiàn)方式。

1. 簡單對象模型

簡單對象模型名副其實,十分簡單。在簡單對象模型中,一個 object是由一系列slots組成,每個slot相當于一個指針,指向一個member,memebers按照聲明的順序與slots一一對應(yīng),這里的members括data membersfunction members。

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

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

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

2. 表格驅(qū)動對象模型

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

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

缺點:空間和時間上的效率降低,具體原因可以參考簡單對象模型的缺點分析。

3. C++ 對象模型

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

對虛函數(shù)的支持主要通過以下幾點完成的:

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

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

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

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

缺點:如果應(yīng)用程序的代碼未曾更改,但所用到的classnonstatic data members有所更改,那么那些代碼仍然需要全部重新編譯,而前面的表格驅(qū)動模型在這方面提供了較大的彈性,因為他多提供了一層間接性,當然是付出了時間和空間上的代價。

在加上繼承情況下的對象模型

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

簡單對象模型中可以通過derived class object中的一個slot來存儲base class subobject的地址,這樣就可以通過該slot來訪問base class的成員。這種實現(xiàn)方式的主要缺點是:因為間接性的存儲而導(dǎo)致空間和存取時間上存在額外負擔;優(yōu)點是:derived class的結(jié)構(gòu)不會因為base class的改變而改變。

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

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

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

總結(jié)

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

上一篇:VC++實現(xiàn)文件與應(yīng)用程序關(guān)聯(lián)的方法(注冊表修改)

欄    目:C語言

下一篇:C語言 數(shù)據(jù)類型詳細介紹

本文標題:深入理解C++的對象模型

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2120.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有