C++用new來建立對象和非new來建立對象的區別

咱們都知道C++中有三種建立對象的方法,以下:
#include <iostream>
using namespace std;

class A
{
private:
    int n;
public:
    A(int m):n(m)
    {
    }
    ~A(){}//定義析構函數,用於能夠支持delete釋放對象引用的內存
};

int main()
{
    A a(1);  //棧中分配
    A b = A(1);  //棧中分配
    A* c = new A(1);  //堆中分配
  delete c;//釋放對象
    return 0;
}

第一種和第二種沒什麼區別,一個隱式調用,一個顯式調用,二者都是在進程虛擬地址空間中的棧中分配內存,而第三種使用了new,在堆中分配了內存,而棧中內存的分配和釋放是由系統管理,而堆中內存的分配和釋放必須由程序員手動釋放,因此這就產生一個問題是把對象放在棧中仍是放在堆中的問題,這個問題又和堆和棧自己的區別有關:html

這裏面有幾個問題:linux

1.堆和棧最大可分配的內存的大小ios

2.堆和棧的內存管理方式程序員

3.堆和棧的分配效率算法

首先針對第一個問題,通常來講對於一個進程棧的大小遠遠小於堆的大小,在linux中,你可使用ulimit -s (單位kb)來查看一個進程棧的最大可分配大小,通常來講不超過8M,有的甚至不超過2M,不過這個能夠設置,而對於堆你會發現,針對一個進程堆的最大可分配的大小在G的數量級上,不一樣系統可能不同,好比32位系統最大不超過2G,而64爲系統最大不超過4G,因此當你須要一個分配的大小的內存時,請用new,即用堆。數據結構

其次針對第二個問題,棧是系統數據結構,對於進程/線程是惟一的,它的分配與釋放由操做系統來維護,不須要開發者來管理。在執行函數時,函數內局部變量的存儲單元均可以在棧上建立,函數執行結束時,這些存儲單元會被自動釋放。棧內存分配運算內置於處理器的指令集中,效率很高,不一樣的操做系統對棧都有必定的限制。 堆上的內存分配,亦稱動態內存分配。程序在運行的期間用malloc申請的內存,這部份內存由程序員本身負責管理,其生存期由開發者決定:在什麼時候分配,分配多少,並在什麼時候用free來釋放該內存。這是惟一能夠由開發者參與管理的內存。使用的好壞直接決定系統的性能和穩定。函數

由上可知,但咱們須要的內存不多,你又能肯定你到底須要多少內存時,請用棧。而當你須要在運行時才知道你到底須要多少內存時,請用堆。性能

最後針對第三個問題,棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率 比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的,例如爲了分配一塊內存,庫函數會按照必定的算法(具體的算法能夠參考數據結構/操做系統)在 堆內存中搜索可用的足夠大小的空間,若是沒有足夠大小的空間(多是因爲內存碎片太多),就有可能調用系統功能去增長程序數據段的內存空間,這樣就有機會 分 到足夠大小的內存,而後進行返回。顯然,堆的效率比棧要低得多。spa

由上可知,能用棧則用棧。操作系統

 

#include <stdio.h>
#include <stdlib.h>  
void main()
{
 int n,*p,i,j,m;
 printf("本程序可對任意個整數排序;\n");
 printf("請輸入整數的總個數: ");
 scanf("%d",&n);
 p=(int *)calloc(n,sizeof(int));    //運行時決定內存分配大小
 if(p==0)   {
  printf("分配失敗!\n");  
  exit(1);  
 }
相關文章
相關標籤/搜索