深入理解C 物件模型1 關於物件

2021-09-18 02:24:33 字數 2502 閱讀 3598

c++物件模型可以從兩個層面來解釋:

本文主要從第二個方面來進行剖析。

注: c++物件模型的底層實現機制並未標準化,不同的編譯器對物件模型的底層實現機制可能有所差異,但其目標都是優化物件空間和時間的訪問效率,並支援c++語言說規定的虛函式,虛基類等機制。

相比於c, c++在記憶體布局以及訪問時間(效率)上的主要的額外負擔(開銷)是由virtual 機制引起的,包括:

virtual function 機制 :用於實現派生類與基類之間同名函式的多型機制,以支援乙個有效率的「執行期動態繫結」;

virtual base class機制:用於實現多次出現在繼承體系中的base class有乙個單一而被共享的實體;

c++中資料成員的種類:static 和nonstatic

c++中函式成員的種類:static,nonstatic和virtual

class

point

上面的class point中個data member和function member 將會有怎樣的記憶體布局,將會表現出怎樣的聯絡?

在簡單物件模型中,乙個object是由一系列的slots組成,每個slot指向乙個members(data member or function member) 。 members按照類中的宣告順序各被指定乙個slot。簡單物件模型如下圖所示:

在這個簡單模型中,object中只存著指向members的指標(slot中存放),這麼做可以避免「member有不同的型別,因而需要不同的儲存空間所招致的問題」。這樣的簡單模型中,乙個class object的記憶體大小很容易計算出來:指標大小*class中宣告的member數目。這種簡單模型需要較大的記憶體空間和執行期效率的開銷,在實際c++編譯器中並不會使用,但是該模型中利用slot存放指向成員的指標的觀念在c++中應用廣泛。

為了對所有classes的所有objects都有一致的表達方式,另一種物件模型是把所有與members相關的資訊抽象出來,放在乙個data member table 和乙個function member tale中,class object本身則只包含指向這兩個table 的指標。function member table是一系列的的slots ,每乙個slot指向乙個member function;data member table則直接包含data本身。**驅動物件模型如下圖所示:

雖然這個模型也並沒有實際用於c++編譯器中,但function member table這個概念卻成為支援virtual function的乙個有效方案。基本c++物件模型中(無派生類):

下圖說明了c++物件模型是如何用於 point class身上的。這個模型的主要優點在於它的空間和訪問時間的效率; 主要缺點在於如果應用程式**本身未曾改變,但是所用到的class objects的nonstatic data members有所修改(增加,刪除或改動),那麼這些應用程式**需要重新編譯。

為了後續方便講述在單繼承和多繼承情況下的c++物件模型,在這裡構造出乙個較為通用的基類base,它包含了 static 和nonstatic的類別資料成員,static,nonstatic和virtual類別的函式成員。

#include

#include

using

namespace std;

class

base

intgetbasevalue()

static

void

counter()

virtual

~base()

virtual

void

print()

private

:int base_value;

static

int base_count;};

void

testbase

(base & p)

intmain()

執行結果:

base類的物件模型如下圖所示:

《深入理解C 物件模型》 預設建構函式

explict關鍵字之所以被匯入c 是為了給程式設計師提供一種方法,使他們能夠制止單一引數的建構函式被當做乙個轉換運算子。深入理解c 物件模型 關於c 預設建構函式什麼時候並合成有四點要求。在介紹這四點要求之前,需要先了解虛基類是如何實現的?虛基類是為了解決多重繼承出現的二義性。class x cl...

深入理解C 中的物件和物件引用

有言在先 返回區域性物件和引用,就像返回區域性變數的位址一樣,非常非常危險,要避免使用 先來看乙個入門級的程式 include using namespace std class a void fun a a int main 結果為 a constructor 編譯器自動產生的拷貝建構函式得到了呼...

深入理解PHP物件賦值

1 2 深入理解php物件賦值 3echo 45 obj new stdclass 6 obj name pig 7var dump obj object stdclass 1 1 89 copy obj obj copy都是new stdclass返回的同乙個識別符號的拷貝 10var dump ...