C 之三種建立物件方法的區別

2021-08-09 04:44:25 字數 3507 閱讀 2422

我們都知道c++中有三種建立物件的方法,如下:

複製****如下:

#include

using namespace std;

class a

~a(){}

};int main()

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

這裡面有幾個問題:

1.

堆和棧最大可分配的記憶體的大小

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

3.堆和棧的分配效率

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

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

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

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

由上可知,能用棧則用棧。

複製****如下:

#include

#include

void main()

c++用

new和不用

new建立類物件區別

起初剛學c++時,很不習慣用new,後來看老外的程式,發現幾乎都是使用new,想一想區別也不是太大,但是在大一點的專案設計中,有時候不使用new的確會帶來很多問題。當然這都是跟new的用法有關的。new建立類物件,使用完後需使用delete刪除,跟申請記憶體類似。所以,new有時候又不太適合,比如在頻繁呼叫場合,使用區域性new類物件就不是個好選擇,使用全域性類物件或乙個經過初始化的全域性類指標似乎更加高效。

一、new建立類物件與不new區別

下面是自己總結的一些關於

new建立類物件特點:

二、new建立類物件例項

1、new建立類物件例子:

ctest* ptest = new ctest();

delete ptest;

ptest用來接收類物件指標。

不用new,直接使用類定義申明:

ctest mtest;

此種建立方式,使用完後不需要手動釋放,該類析構函式會自動執行。而new申請的物件,則只有呼叫到delete時再會執行析構函式,如果程式退出而沒有執行delete則會造成記憶體洩漏。

2、只定義類指標

這跟不用new申明物件有很大區別,類指標可以先行定義,但類指標只是個通用指標,在new之前並為該類物件分配任何記憶體空間。比如:

ctest* ptest = null;

但使用普通方式建立的類物件,在建立之初就已經分配了記憶體空間。而類指標,如果未經過物件初始化,則不需要

delete

釋放。3、new物件指標作為函式引數和返回值

下面是天緣隨手寫乙個例子,不太嚴謹。主要示意一下類指標物件作為返回值和引數使用。

class ctest ;    class cbest ;    ctest* fun(cbest* pbest)    int main()

有時候書看多了,遇到了以前沒注意到的小細節就會犯迷糊,查了些資料大致弄明白了點關於

new物件和直接引用物件的區別。

眾所周知,在

c++裡面可以

new物件,也可以直接宣告物件。

編譯器把記憶體分為三個部分: 1.

靜態儲存區域:主要儲存全域性變數和靜態變數。生存期:整個程式。

2.堆:儲存動態生成的變數。生存期:自己來決定。

3.{}

的範圍)

假設定義乙個類

myclass

1)宣告建立物件

我們要建立物件的時候就是直接

myclass myclass;  

這時在中已經為它分配了乙個空間存放所有的成員變數,但是為了節約記憶體空間成員函式

被存放在了乙個公共區域,這個類的所有的物件都可以共同享有。

呼叫這個物件的成員變數和成員函式時用「.」操作符。如:

myclass.value,myclass.function()。

(2)

new物件

用這種方法建立物件時我們採取這樣的方法

myclass *myclass = new myclass();  

通過new

建立的例項返回的是物件指標(

myclass

指向乙個

myclass

的物件),同時在上為它分配空間,並且需要顯式的釋放空間,delete

物件的時候才會呼叫物件的析構函式。

因為是指標的操作,所以呼叫這個物件的成員變數和函式時要用

「->」

例如myclass.value ,myclss->function()。

總結

事實上兩種方式效果相同,我們在選擇用哪種方式的來建立的時候主要考慮的就是,你想讓這個物件存活多久。

C 三種建立物件的方法區別

我們都知道c 中有三種建立物件的方法,如下 複製 如下 include using namespace std class a a int main 第一種和第二種沒什麼區別,乙個隱式呼叫,乙個顯式呼叫,兩者都是在程序虛擬位址空間中的棧中分配記憶體,而第三種使用了new,在堆中分配了記憶體,而棧中記...

c 建立物件的三種方法

c 有三種方法建立物件 結合 來看 1 include 2 using namespace std 3 class test 第一種和第二種沒什麼區別,乙個隱式呼叫,乙個顯式呼叫,兩者都是在程序虛擬位址空間中的棧中分配記憶體。棧是系統資料結構,對於執行緒 程序是唯一的,它的分配和釋放由作業系統決定,...

c 建立物件的三種方法

c 有三種方法建立物件 結合 來看 1 include 2 using namespace std 3 class test第一種和第二種沒什麼區別,乙個隱式呼叫,乙個顯式呼叫,兩者都是在程序虛擬位址空間中的棧中分配記憶體。棧是系統資料結構,對於執行緒 程序是唯一的,它的分配和釋放由作業系統決定,不...