欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++用new創(chuàng)建對象和不用new創(chuàng)建對象的區(qū)別解析

 更新時(shí)間:2013年07月26日 09:05:39   作者:  
在C++用new創(chuàng)建對象和不用new創(chuàng)建對象是有區(qū)別的,不知你是否清楚的了解它們到底有什么樣的區(qū)別呢?下面小編就用示例來告訴大家吧,需要的朋友可以過來參考下

我們都知道C++中有三種創(chuàng)建對象的方法,如下:

復(fù)制代碼 代碼如下:

#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;
}


第一種和第二種沒什么區(qū)別,一個(gè)隱式調(diào)用,一個(gè)顯式調(diào)用,兩者都是在進(jìn)程虛擬地址空間中的棧中分配內(nèi)存,而第三種使用了new,在堆中分配了內(nèi)存,而棧中內(nèi)存的分配和釋放是由系統(tǒng)管理,而堆中內(nèi)存的分配和釋放必須由程序員手動釋放,所以這就產(chǎn)生一個(gè)問題是把對象放在棧中還是放在堆中的問題,這個(gè)問題又和堆和棧本身的區(qū)別有關(guān):

這里面有幾個(gè)問題:
1.堆和棧最大可分配的內(nèi)存的大小
2.堆和棧的內(nèi)存管理方式
3.堆和棧的分配效率

首先針對第一個(gè)問題,一般來說對于一個(gè)進(jìn)程棧的大小遠(yuǎn)遠(yuǎn)小于堆的大小,在linux中,你可以使用ulimit -s (單位kb)來查看一個(gè)進(jìn)程棧的最大可分配大小,一般來說不超過8M,有的甚至不超過2M,不過這個(gè)可以設(shè)置,而對于堆你會發(fā)現(xiàn),針對一個(gè)進(jìn)程堆的最大可分配的大小在G的數(shù)量級上,不同系統(tǒng)可能不一樣,比如32位系統(tǒng)最大不超過2G,而64為系統(tǒng)最大不超過4G,所以當(dāng)你需要一個(gè)分配的大小的內(nèi)存時(shí),請用new,即用堆。

其次針對第二個(gè)問題,棧是系統(tǒng)數(shù)據(jù)結(jié)構(gòu),對于進(jìn)程/線程是唯一的,它的分配與釋放由操作系統(tǒng)來維護(hù),不需要開發(fā)者來管理。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí),這些存儲單元會被自動釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,不同的操作系統(tǒng)對棧都有一定的限制。 堆上的內(nèi)存分配,亦稱動態(tài)內(nèi)存分配。程序在運(yùn)行的期間用malloc申請的內(nèi)存,這部分內(nèi)存由程序員自己負(fù)責(zé)管理,其生存期由開發(fā)者決定:在何時(shí)分配,分配多少,并在何時(shí)用free來釋放該內(nèi)存。這是唯一可以由開發(fā)者參與管理的內(nèi)存。使用的好壞直接決定系統(tǒng)的性能和穩(wěn)定。

由上可知,但我們需要的內(nèi)存很少,你又能確定你到底需要多少內(nèi)存時(shí),請用棧。而當(dāng)你需要在運(yùn)行時(shí)才知道你到底需要多少內(nèi)存時(shí),請用堆。

最后針對第三個(gè)問題,棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率 比較高。堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的,例如為了分配一塊內(nèi)存,庫函數(shù)會按照一定的算法(具體的算法可以參考數(shù)據(jù)結(jié)構(gòu)/操作系統(tǒng))在 堆內(nèi)存中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由于內(nèi)存碎片太多),就有可能調(diào)用系統(tǒng)功能去增加程序數(shù)據(jù)段的內(nèi)存空間,這樣就有機(jī)會 分 到足夠大小的內(nèi)存,然后進(jìn)行返回。顯然,堆的效率比棧要低得多。

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

復(fù)制代碼 代碼如下:

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

相關(guān)文章

  • C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)詳細(xì)講解

    C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)詳細(xì)講解

    高精度算法的本質(zhì)是把大數(shù)拆成若干固定長度的塊,然后對每一塊進(jìn)行相應(yīng)的運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C++表達(dá)式new與delete知識詳解

    C++表達(dá)式new與delete知識詳解

    這篇文章主要為大家詳細(xì)介紹了C++表達(dá)式new與delete知識點(diǎn),學(xué)習(xí)如何動態(tài)創(chuàng)建對象,動態(tài)創(chuàng)建的對象與一般對象的區(qū)別,動態(tài)創(chuàng)建的對象的初始化以及釋放動態(tài)分配的內(nèi)存等知識點(diǎn),感興趣的朋友可以參考一下
    2016-05-05
  • C++拷貝構(gòu)造函數(shù)(深拷貝與淺拷貝)詳解

    C++拷貝構(gòu)造函數(shù)(深拷貝與淺拷貝)詳解

    深拷貝和淺拷貝可以簡單理解為:如果一個(gè)類擁有資源,當(dāng)這個(gè)類的對象發(fā)生復(fù)制過程的時(shí)候,資源重新分配,這個(gè)過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝
    2013-09-09
  • C語言中關(guān)于指針變量的坑

    C語言中關(guān)于指針變量的坑

    這篇文章主要給大家介紹了關(guān)于C語言中關(guān)于指針變量坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C語言進(jìn)階:指針的進(jìn)階(3)

    C語言進(jìn)階:指針的進(jìn)階(3)

    這篇文章主要介紹了C語言指針詳解及用法示例,介紹了其相關(guān)概念,然后分享了幾種用法,具有一定參考價(jià)值。需要的朋友可以了解下
    2021-09-09
  • 如何在C++中調(diào)用python代碼你知道嗎

    如何在C++中調(diào)用python代碼你知道嗎

    這篇文章主要為大家介紹了C++中調(diào)用python代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C++實(shí)現(xiàn)截圖截屏的示例代碼

    C++實(shí)現(xiàn)截圖截屏的示例代碼

    本文主要介紹了C++實(shí)現(xiàn)截圖截屏的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C/C++回調(diào)函數(shù)介紹

    C/C++回調(diào)函數(shù)介紹

    回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用為調(diào)用它所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)
    2013-10-10
  • VC++ loadlibrary()加載三方dll失敗, 返回錯(cuò)誤碼:126的解決方法

    VC++ loadlibrary()加載三方dll失敗, 返回錯(cuò)誤碼:126的解決方法

    今天在編寫VC++ loadlibrary()加載三方dll是總是失敗,并且返回錯(cuò)誤碼:126,這里就為大家分享一下具體的解決方法
    2021-03-03
  • 詳解c語言實(shí)現(xiàn)的內(nèi)存池(適用于兩個(gè)線程、不加鎖、效率高)

    詳解c語言實(shí)現(xiàn)的內(nèi)存池(適用于兩個(gè)線程、不加鎖、效率高)

    這篇文章主要介紹了c語言實(shí)現(xiàn)的內(nèi)存池(適用于兩個(gè)線程、不加鎖、效率高),設(shè)計(jì)一個(gè)內(nèi)存池,要求效率比系統(tǒng)調(diào)用的效率要高(測試1萬次),同時(shí)支持一個(gè)線程申請,另外一個(gè)線程釋放,需要的朋友可以參考下
    2024-02-02

最新評論