C++中有三種建立物件的方法

lightmare625發表於2018-07-29

 

 

#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,在堆中分配了記憶體,而棧中記憶體的分配和釋放是由系統管理,而堆中記憶體的分配和釋放必須由程式設計師手動釋放。採用第三種方式時,必須注意一下幾點問題:

 

  1. new建立類物件需要指標接收,一處初始化,多處使用
  2. new建立類物件使用完需delete銷燬
  3. new建立物件直接使用堆空間,而區域性不用new定義類物件則使用棧空間
  4. new物件指標用途廣泛,比如作為函式返回值、函式引數等
  5. 頻繁呼叫場合並不適合new,就像new申請和釋放記憶體一樣
  6. 棧的大小遠小於堆的大
  7. 棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率 比較高。堆則是C/C++函式庫提供的,它的機制是很複雜的,例如為了分配一塊記憶體,庫函式會按照一定的演算法(具體的演算法可以參考資料結構/作業系統)在 堆記憶體中搜尋可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就有機會 分 到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低得多。

相關文章