C++中有三種建立物件的方法
#include <iostream>
using namespace std;
class A
{
private:
int n;
public:
A(int m):n(m)
{ }
~A(){}
};
int main()
{
A a(1); //棧中分配
A b = A(1); //棧中分配
A* c = new A(1); //堆中分配
delete c;
return 0;
}
第一種和第二種沒什麼區別,一個隱式呼叫,一個顯式呼叫,兩者都是在程式虛擬地址空間中的棧中分配記憶體,而第三種使用了new,在堆中分配了記憶體,而棧中記憶體的分配和釋放是由系統管理,而堆中記憶體的分配和釋放必須由程式設計師手動釋放。採用第三種方式時,必須注意一下幾點問題:
- new建立類物件需要指標接收,一處初始化,多處使用
- new建立類物件使用完需delete銷燬
- new建立物件直接使用堆空間,而區域性不用new定義類物件則使用棧空間
- new物件指標用途廣泛,比如作為函式返回值、函式引數等
- 頻繁呼叫場合並不適合new,就像new申請和釋放記憶體一樣
- 棧的大小遠小於堆的大
- 棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率 比較高。堆則是C/C++函式庫提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的演算法(具體的演算法可以參考資料結構/作業系統)在 堆記憶體中搜尋可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就有機會 分 到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多。
相關文章
- JavaScript建立物件的多種方法JavaScript物件
- 最全--Java中建立物件的5種方法Java物件
- 五種方法建立java物件,你知道幾種呢?Java物件
- js建立物件的各種方法以及優缺點JS物件
- 快速排序的三種實現方法 (C++)排序C++
- 建立物件的幾種模式物件模式
- js建立物件的方法JS物件
- java建立物件的五種方式Java物件
- 建立Session物件的兩種方式Session物件
- Python判斷物件是否為檔案物件(file object)的三種方法Python物件Object
- JS中建立物件的方法JS物件
- Qt中用C++呼叫Python檔案的三種方法QTC++Python
- Java中建立物件的5種方式Java物件
- Java建立物件的方法有哪些?Java物件
- 建立獨立的Java可執行JAR的三種方法 - frankelJavaJAR
- JavaScript物件的建立方式有幾種?JavaScript物件
- JS 建立例項物件的四種模式JS物件模式
- JavaScript 基礎(二) – 建立 function 物件的方法, String物件, Array物件JavaScriptFunction物件
- 區塊鏈開發中有哪三種橋區塊鏈
- 「有點收穫」三種基本方法建立執行緒執行緒
- php中有沒有物件PHP物件
- 建立執行緒的三種方式執行緒
- spark 三種建立 資料集的方法,及測試(Scala程式碼)Spark
- JavaScript建立物件(三)——原型模式JavaScript物件原型模式
- js判斷物件的幾種方法JS物件
- 構建Java物件的五種方法Java物件
- 獲取 Class 物件的 3 種方法物件
- JS遍歷物件的幾種方法JS物件
- 為什麼Java中有三種基礎的類載入器?Java
- JS中有趣的內建物件-JSON物件JSON
- C++物件導向三大特性C++物件
- 兩種動態建立表格的方法
- python之建立類的兩種方法Python
- JS 基礎篇(一):建立物件的四種方式JS物件
- 判斷一個物件為空物件的5種方法物件
- 在 .NET 中建立物件的幾種方式的對比物件
- 關於C++類的定義和物件的建立詳解C++物件
- 四種在Javascript比較物件的方法JavaScript物件