C++用new創(chuàng)建對(duì)象和不用new創(chuàng)建對(duì)象的區(qū)別解析
我們都知道C++中有三種創(chuàng)建對(duì)象的方法,如下:
#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)存的分配和釋放必須由程序員手動(dòng)釋放,所以這就產(chǎn)生一個(gè)問題是把對(duì)象放在棧中還是放在堆中的問題,這個(gè)問題又和堆和棧本身的區(qū)別有關(guān):
這里面有幾個(gè)問題:
1.堆和棧最大可分配的內(nèi)存的大小
2.堆和棧的內(nèi)存管理方式
3.堆和棧的分配效率
首先針對(duì)第一個(gè)問題,一般來說對(duì)于一個(gè)進(jìn)程棧的大小遠(yuǎn)遠(yuǎn)小于堆的大小,在linux中,你可以使用ulimit -s (單位kb)來查看一個(gè)進(jìn)程棧的最大可分配大小,一般來說不超過8M,有的甚至不超過2M,不過這個(gè)可以設(shè)置,而對(duì)于堆你會(huì)發(fā)現(xiàn),針對(duì)一個(gè)進(jìn)程堆的最大可分配的大小在G的數(shù)量級(jí)上,不同系統(tǒng)可能不一樣,比如32位系統(tǒng)最大不超過2G,而64為系統(tǒng)最大不超過4G,所以當(dāng)你需要一個(gè)分配的大小的內(nèi)存時(shí),請(qǐng)用new,即用堆。
其次針對(duì)第二個(gè)問題,棧是系統(tǒng)數(shù)據(jù)結(jié)構(gòu),對(duì)于進(jìn)程/線程是唯一的,它的分配與釋放由操作系統(tǒng)來維護(hù),不需要開發(fā)者來管理。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí),這些存儲(chǔ)單元會(huì)被自動(dòng)釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,不同的操作系統(tǒng)對(duì)棧都有一定的限制。 堆上的內(nèi)存分配,亦稱動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的期間用malloc申請(qǐng)的內(nèi)存,這部分內(nèi)存由程序員自己負(fù)責(zé)管理,其生存期由開發(fā)者決定:在何時(shí)分配,分配多少,并在何時(shí)用free來釋放該內(nèi)存。這是唯一可以由開發(fā)者參與管理的內(nèi)存。使用的好壞直接決定系統(tǒng)的性能和穩(wěn)定。
由上可知,但我們需要的內(nèi)存很少,你又能確定你到底需要多少內(nèi)存時(shí),請(qǐng)用棧。而當(dāng)你需要在運(yùn)行時(shí)才知道你到底需要多少內(nèi)存時(shí),請(qǐng)用堆。
最后針對(duì)第三個(gè)問題,棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率 比較高。堆則是C/C++函數(shù)庫提供的,它的機(jī)制是很復(fù)雜的,例如為了分配一塊內(nèi)存,庫函數(shù)會(huì)按照一定的算法(具體的算法可以參考數(shù)據(jù)結(jié)構(gòu)/操作系統(tǒng))在 堆內(nèi)存中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由于內(nèi)存碎片太多),就有可能調(diào)用系統(tǒng)功能去增加程序數(shù)據(jù)段的內(nèi)存空間,這樣就有機(jī)會(huì) 分 到足夠大小的內(nèi)存,然后進(jìn)行返回。顯然,堆的效率比棧要低得多。
由上可知,能用棧則用棧。
#include <stdio.h>
#include <stdlib.h>
void main()
{
int n,*p,i,j,m;
printf("本程序可對(duì)任意個(gè)整數(shù)排序;\n");
printf("請(qǐng)輸入整數(shù)的總個(gè)數(shù): ");
scanf("%d",&n);
p=(int *)calloc(n,sizeof(int)); //運(yùn)行時(shí)決定內(nèi)存分配大小
if(p==0) {
printf("分配失敗!\n");
exit(1);
}
上一篇:c++中冒號(hào)(:)和雙冒號(hào)(::)的使用說明
欄 目:C語言
本文標(biāo)題:C++用new創(chuàng)建對(duì)象和不用new創(chuàng)建對(duì)象的區(qū)別解析
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4261.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什