c 物件模型

2021-04-27 16:28:50 字數 2000 閱讀 6975

很久之前就想總結一下c++的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。

1.程式使用記憶體區

乙個程式占用的記憶體區一般分為5種:

(1)全域性、靜態資料區:儲存全域性變數及靜態變數(包括全域性靜態變數和區域性靜態變數)

(2)常量資料區:儲存程式中的常量字串等。

(3)**區:儲存程式的**。

(4)棧:儲存自動變數或者區域性變數,以及傳遞的函式引數等。

(5)堆:儲存動態產生的資料。

在處理記憶體時,系統會自動將記憶體對齊,這樣雖然會浪費一些記憶體,但由於cpu在對齊方式下執行比較快,所以

一般都是對程式效能還是有好處的。

乙個程式使用的棧的大小是固定的,由編譯器決定。一般是1mb。

棧的記憶體是系統自動分配的,壓棧和出棧都有相應的指令進行操作。因此效率較高,並且分配的記憶體空間是連

續的,不會產生記憶體碎片;而堆上的記憶體是由開發人員來動態分配和**的。在分配記憶體時,系統需要按照一定

的演算法在堆空間中尋找合適大小的空閒堆,並修改相應的維護堆空閒空間的鍊錶,然後返回位址給程式。因此效

率比棧要低,此外還容易產生記憶體碎片。

從c++物件模型的角度來說,物件就是記憶體中的一片區域。如果乙個物件通過定義在某個函式內的變數或者實現

需要的臨時變數來建立時,它是棧上的乙個物件;如果乙個物件是定義在全域性範圍內的變數,則它是儲存全域性/靜

態資料區;如果乙個物件是通過new操作符來建立時,它是堆上的乙個物件。

2.物件的生命週期

(1)通過定義變數建立物件:在這種情況下,變數的作用域決定了物件的生命週期。當進入變數的作用域時,對

象被建立。而退出變數的作用域時,物件被銷毀。值得注意的是靜態變數和全域性變數,由於全域性變數的作用域是整

個程式,因此被宣告為全域性變數的物件在程式呼叫main()函式之前被建立。當程式退出main()函式之後,全域性物件

才被銷毀。靜態物件與全域性物件類似,雖然靜態變數的作用域不是整個程式,但靜態變數是儲存在全域性/靜態資料區

中,在程式開始時已經分配好。因此宣告為靜態變數的物件第一次進入作用域時被建立,直到程式退出時被銷毀。

(2)通過new操作符建立物件:這種情況相對比較簡單,但也最容易造成記憶體洩漏。通過new建立的物件會一直存在,

直到被delete銷毀。即使指向該物件的指標(一般都是自動變數)已被銷毀,但還沒有呼叫delete,該物件就會一直

存在。即佔據記憶體空間,直到程式退出,因此也就造成記憶體洩漏。

(3)通過實現建立物件:這種情況一般是指一些隱藏的中間臨時變數的建立和銷毀。它們的生命週期很短,也不容易

被開發人員發覺。但常常是造成程式效能下降的瓶頸,尤其是對於那些占用記憶體較多,建立速度較慢的物件。這些臨時

物件一般是通過copy constructor建立的。在實際開發中,通過值傳遞傳遞引數,過載+及++等操作符,對物件進行算術

運算時,也會有臨時物件,對於這些情況,都要盡量避免不必要的臨時物件的出現。

3.c++物件的記憶體布局

(1)非靜態資料成員是影響物件佔據記憶體大小的主要因素,隨著物件數目的增加,非靜態資料成員佔據的記憶體會相應增加。

(2)所有的物件共享乙份靜態資料成員,所以靜態資料成員佔據的記憶體的數量不會隨著物件數目的增加而增加。

(3)靜態成員函式和非靜態成員函式不會影響物件記憶體的大小,雖然其實現會佔據相應的記憶體空間,同樣也不會隨著物件

數目的增加而增加。

(4)如果物件中包含虛函式,會增加4個位元組的空間(虛函式表指標),不論有多少個虛函式

類的靜態函式只有乙個例項,同樣的,非靜態成員函式也是乙個例項,無論是否建立該類的物件,靜態、非靜態函式都存在。 

std::ostream並沒有對void(__thiscall a::*)()型別過載 < 《操作符,編譯器將這種型別轉換為bool型別,因此輸出為1(或0),而靜態函式並非__thiscall,而是__cdecl,std::ostream有對它的過載,因此類的靜態函式可以直接用cout輸出函式位址。 

printf可以接收任意型別的引數,包括__thiscall型別的類成員函式,因此它可以輸出該種函式位址

C 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...

C 物件模型

簡單物件模型 乙個c 物件儲存了所有指向成員的指標,而成員本身不儲存在物件中。也就是說不論資料成員還是成員函式,也不論這個是普通成員函式還是虛函式,它們都儲存在物件本身之外,同時物件儲存指向它們的指標。示意圖如右。簡單物件模型對於編譯器來說雖然極盡簡單,但同時付出的代價是空間和執行期的效率.顯而易見...

C 物件模型

一 c 簡單物件模型 乙個ojbect是一系列的slots,每個slots指向乙個members data member or function member members都不放在objects之中,objects中有的只是一系列member的指標而已 簡單物件模型中的索引思想引申出兩指向成員的指...