C 物件模型和布局(三種經典類物件記憶體布局)

2021-10-13 15:21:06 字數 1659 閱讀 6913

侯捷翻譯的《深度探索c++物件模型》一書中,對c++物件模型進行了三種典型模型劃分,分別為簡單物件模型(a ****** object model)、**驅動物件模型(a table-drive object model)、c++物件模型(the c++ object、 model)。本文以及之後的部落格主要總結的都是最後乙個c++物件模型。在c++中,成員分為成員變數和成員函式,其中成員變數分別靜態成員變數(class static data members)、非靜態成員變數(class nonstatic data members),成員函式分為靜態成員函式(class static member function)、非靜態成員函式(class nonstatic member function)、虛函式(class virtual member function)。

下面分別總結三種經典物件模型。

設計乙個經典類point如下,那麼這個類的三種物件模型布局將在下面詳細講解和分析。

c++簡單物件模型每乙個object都由一系列的槽slot(本質是指標)組成,每乙個slot指向乙個成員member,member的布局按其宣告順序排列,如圖一的記憶體模型所示。

優點:節省記憶體空間,每乙個槽大小固定,無論成員記憶體是多大,都只有乙個指標大小(在32位系統中乙個指標大小是4byte)。

缺點:執行效率低下,繼承越多,效率急速下降。

c++**驅動物件對簡單物件模型進行一層封裝,只有兩個slot(指標),分別指向成員變數表(member data table)和成員函式表(function member table)。其中,成員變數表直接存放該物件的資料成員,而成員函式表存放的是該物件所有函式的位址(或指標),如上面的圖2所示。

優點:降低了物件的slot,也就是意味著提高了訪問成員的效率,直接訪問變數提高了效率和記憶體緊湊方便定址。

缺點:成員變數一級定址和成員函式二級定址執行效率仍然很低,繼承越多,效率下降越明顯。

c++物件模型從簡單物件模型派生,對簡單物件模型的記憶體和空間做了優化。此模型中,非靜態成員變數(nonstatic data members)放置在class object內,而靜態成員變數(static data members)則放置在object之外的靜態資料區,靜態成員函式(static function members)和非靜態成員函式(nonstatic function members)同樣也放置在class object之外的靜態資料區和普通函式區域,如上面的圖3所示。虛函式(virtual function)則由乙個虛函式**表示,虛函式表由乙個class object內的虛指標(vptr_point)指引,該虛指標的值由類的建構函式、析構函式、拷貝建構函式自動完成。通常虛函式指標位於類物件的第一位。

優點:空間和訪問時間效率高。

缺點:如果應用程式**本身未改變,但所用到的類物件的非靜態資料成員有所修改(增加、移除、修改),那麼那些應用程式**同樣需要重新編譯。

C 物件模型筆記 物件的三種記憶體布局

下面的c 定義了乙個類point view plaincopy to clipboardprint?class point class point 現在定義point的乙個物件pt point pt 這個筆記討論的問題就是 如果讓你設計這個物件的記憶體布局,你會怎麼設計它?記憶體布局在這裡指的是物件...

C 物件模型筆記 物件的三種記憶體布局

下面的c 定義了乙個類 point 現在定義 point 的乙個物件pt point pt 這個筆記討論的問題就是 如果讓你設計這個物件的記憶體布局,你會怎麼設計它?記憶體布局在這裡指的是物件各個成員在記憶體的排放 下面給出 lippman 在 深度探索 c 物件模型 中提出的三種可能的記憶體布局。...

C 類和物件(三) C 物件模型和this指標

c 中,類的成員變數和成員函式分開儲存。只有非靜態成員變數屬於類的物件,占用物件的記憶體空間。注1 非靜態成員函式和靜態成員 包括靜態成員變數與靜態成員函式 均不屬於類的物件,不占用物件的記憶體空間。注2 非靜態成員函式並非某個物件獨有,記憶體中僅存在乙份資料 乙份函式例項 不同物件的某個非靜態成員...