C++用new建立對象和不用new建立對象的區別解析

來源:互聯網
上載者:User

在C++用new建立對象和不用new建立對象是有區別的,不知你是否清楚的瞭解它們到底有什麼樣的區別呢?下面小編就用樣本來告訴大家吧,需要的朋友可以過來參考下 

我們都知道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,在堆中分配了記憶體,而棧中內 存的分配和釋放是由系統管理,而堆中記憶體的分配和釋放必須由程式員手動釋放,所以這就產生一個問題是把對象放在棧中還是放在堆中的問題,這個問題又和堆和 棧本身的區別有關:

這裡面有幾個問題:
1.堆和棧最大可分配的記憶體的大小
2.堆和棧的記憶體管理方式
3.堆和棧的分配效率

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

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

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

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

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

複製代碼 代碼如下:
#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); 
 } 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.