c 例項化物件的方式及其區別

2021-10-05 00:14:56 字數 1687 閱讀 2985

1.隱式建立

class

cemployee

cemployee

(int id)

~cemployee()

void

outputname()

};intmain()

2.顯示建立
int

main()

3.new建立
int

main()

這種方式使用了new關鍵字,在堆中分配了記憶體,堆上的記憶體分配,亦稱動態記憶體分配。程式在執行的期間用malloc申請的記憶體,這部分記憶體由程式設計師自己負責管理,其生存期由開發者決定:在何時分配,分配多少,並在何時用free來釋放該記憶體。

使用new時注意:

new建立類物件需要指標接收,一處初始化,多處使用

new建立類物件使用完需delete銷毀

new建立物件直接使用堆空間,而區域性不用new定義類物件則使用棧空間

new物件指標用途廣泛,比如作為函式返回值、函式引數等

頻繁呼叫場合並不適合new,就像new申請和釋放記憶體一樣

classa a =

classa()

;classa *ap =

newclassa()

;

第一種方式是在程序虛擬位址空間中的棧中分配記憶體,而第二種使用了new,在堆中分配了記憶體,而棧中記憶體的分配和釋放是由系統管理,而堆中記憶體的分配和釋放必須由程式設計師手動釋放,所以這就產生乙個問題是把物件放在棧中還是放在堆中的問題,這個問題又和堆和棧本身的區別有關:

1.堆和棧最大可分配記憶體

一般來說對於乙個程序棧的大小遠遠小於堆的大小,在linux中,你可以使用ulimit -s (單位kb)來檢視乙個程序棧的最大可分配大小,一般來說不超過8m,有的甚至不超過2m,不過這個可以設定,而對於堆你會發現,針對乙個程序堆的最大可分配的大小在g的數量級上,不同系統可能不一樣,比如32位系統最大不超過2g,而64為系統最大不超過4g,所以當你需要乙個分配的較大記憶體時,請用new,即用堆。

2.堆和棧的記憶體管理方式

其次針對第二個問題,棧是系統資料結構,對於程序/執行緒是唯一的,它的分配與釋放由作業系統來維護,不需要開發者來管理。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時,這些儲存單元會被自動釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,不同的作業系統對棧都有一定的限制。 堆上的記憶體分配,亦稱動態記憶體分配。程式在執行的期間用malloc申請的記憶體,這部分記憶體由程式設計師自己負責管理,其生存期由開發者決定:在何時分配,分配多少,並在何時用free來釋放該記憶體。這是唯一可以由開發者參與管理的記憶體。使用的好壞直接決定系統的效能和穩定。

由上可知,但我們需要的記憶體很少,你又能確定你到底需要多少記憶體時,請用棧。而當你需要在執行時才知道你到底需要多少記憶體時,請用堆。

最後針對第三個問題,棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率 比較高。堆則是c/c++函式庫提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的演算法(具體的演算法可以參考資料結構/作業系統)在 堆記憶體中搜尋可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就有機會 分 到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多。

C 的三種例項化物件方式

2019 05 04 19 15 43 d89538239 閱讀數 385 class cemployee cemployee int id cemployee void outputname 這種建立方式和第一種一樣,在程序虛擬位址空間中的棧中分配記憶體,它的分配和釋放由系統決定,函式內區域性變數...

php多種方式例項化物件

created by phpstorm.user qlx date 2019 9 3 time 21 40 例項化類方式 class myclass public function printstr public static function init public function newsta...

C 類例項化方式

c 中,例項化方式一般有兩種 1,直接定義物件,這時成員變數需要通過 來訪問,如 a a 2,定義乙個類指標,這時需要用到new方法,如 a a new a。訪問類的成員函式或者說是成員變數需要通過 但是這個時候,當物件使用完成之後,需要使用delete a 把該指標刪除。怎樣選擇 二者的記憶體分配...