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++函式庫提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的演算法(具體的演算法可以參考資料結構/作業系統)在 堆記憶體中搜尋可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就有機會 分 到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多。
相關文章
- C++中建立物件的兩種方法及其區別C++物件
- javascript建立物件的三種方式JavaScript物件
- JavaScript建立物件的多種方法JavaScript物件
- C++中建立持久物件的方法C++物件
- 最全--Java中建立物件的5種方法Java物件
- C++中建立物件間訊息連線的一種系統方法 (轉)C++物件
- JavaScript建立物件4種方法詳解JavaScript物件
- Unreal Cook Book:建立物件的的幾種姿勢(C++)Unreal物件C++
- 獲取表單物件的三種方法物件
- mysql建立使用者的三種方法MySql
- 五種方法建立java物件,你知道幾種呢?Java物件
- 快速排序的三種實現方法 (C++)排序C++
- js建立物件的各種方法以及優缺點JS物件
- Perl中有效建立Getter 和Setter的方法
- 建立物件的幾種模式物件模式
- JS建立物件幾種不同方法詳解JS物件
- js建立物件的方法JS物件
- java建立物件的五種方式Java物件
- js建立物件的幾種方式JS物件
- JavaScript 建立物件的七種方式JavaScript物件
- javascript建立物件的幾種方式JavaScript物件
- [php]建立物件的幾種形式PHP物件
- 建立Session物件的兩種方式Session物件
- JS中建立物件的方法JS物件
- Python判斷物件是否為檔案物件(file object)的三種方法Python物件Object
- Qt中用C++呼叫Python檔案的三種方法QTC++Python
- Java中建立物件的5種方式Java物件
- js中建立物件的幾種方式JS物件
- JavaScript 建立類/物件的幾種方式JavaScript物件
- 區塊鏈開發中有哪三種橋區塊鏈
- JS_建立物件+呼叫物件方法JS物件
- 建立獨立的Java可執行JAR的三種方法 - frankelJavaJAR
- [C++]類和物件(三)C++物件
- Java建立物件的方法有哪些?Java物件
- 三種跳出迴圈的方法--9個jsp內建物件JS物件
- JS 建立例項物件的四種模式JS物件模式
- JavaScript物件的建立方式有幾種?JavaScript物件
- js中建立物件的幾種常用方式JS物件