日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > C++ > 正文

淺析C++的內(nèi)存分配方式

2023-06-05 11:58:39
字體:
供稿:網(wǎng)友

本文詳細(xì)地介紹了C++語言內(nèi)存的種類及分配方式,很適合初學(xué)者學(xué)習(xí)和資深編程者來研究閱讀。

在C++中,內(nèi)存分成5個(gè)區(qū),他們分別是堆、棧、自由存儲(chǔ)區(qū)、全局/ 靜態(tài)存儲(chǔ)區(qū)和常量存儲(chǔ)區(qū)。

棧,就是那些由編譯器在需要的時(shí)候分配,在不需要的時(shí)候自動(dòng)清楚的變量的存儲(chǔ)區(qū)。里面的變量通常是局部變量、函數(shù)參數(shù)等。

堆,就是那些由new分配的內(nèi)存塊,他們的釋放編譯器不去管,由我們的應(yīng)用程序去控制,一般一個(gè)new就要對應(yīng)一個(gè) delete。如果程序員沒有釋放掉,那么在程序結(jié)束后,操作系統(tǒng)會(huì)自動(dòng)回收。

自由存儲(chǔ)區(qū),就是那些由malloc等分配的內(nèi)存塊,他和堆是十分相似的,不過它是用free來結(jié)束自己的生命的。

全局/靜態(tài)存儲(chǔ)區(qū),全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中,在以前的C語言中,全局變量又分為初始化的和未初始化的,在C++里面沒有這個(gè)區(qū)分了,他們共同占用同一塊內(nèi)存區(qū)。

常量存儲(chǔ)區(qū),這是一塊比較特殊的存儲(chǔ)區(qū),他們里面存放的是常量,不允許修改(當(dāng)然,你要通過非正當(dāng)手段也可以修改,而且方法很多,在《const的思考》一文中,我給出了6種方法)

明確區(qū)分堆與棧

首先,我們舉一個(gè)例子:

void f() { int* p=new int[5]; }

這條短短的一句話就包含了堆與棧,看到new,我們首先就應(yīng)該想到,我們分配了一塊堆內(nèi)存,那么指針p呢?他分配的是一塊棧內(nèi)存,所以這句話的意思就是:在棧內(nèi)存中存放了一個(gè)指向一塊堆內(nèi)存的指針p。在程序會(huì)先確定在堆中分配內(nèi)存的大小,然后調(diào)用operator new分配內(nèi)存,然后返回這塊內(nèi)存的首地址,放入棧中,他在VC6下的匯編代碼如下:

00401028 push 14h
0040102A call operator new (00401060)
0040102F add esp,4
00401032 mov dword ptr [ebp-8],eax
00401035 mov eax,dword ptr [ebp-8]
00401038 mov dword ptr [ebp-4],eax

這里,我們?yōu)榱撕唵尾]有釋放內(nèi)存,那么該怎么去釋放呢?是delete p么?澳,錯(cuò)了,應(yīng)該是delete []p,這是為了告訴編譯器:我刪除的是一個(gè)數(shù)組,VC6就會(huì)根據(jù)相應(yīng)的Cookie信息去進(jìn)行釋放內(nèi)存的工作。

好了,我們回到我們的主題:堆和棧究竟有什么區(qū)別?

主要的區(qū)別由以下幾點(diǎn):

(1)管理方式不同;

(2)空間大小不同;

(3)能否產(chǎn)生碎片不同;

(4)生長方向不同;

(5)分配方式不同;

(6)分配效率不同;

管理方式:對于棧來講,是由編譯器自動(dòng)管理,無需我們手工控制;對于堆來說,釋放工作由程序員控制,容易產(chǎn)生memory leak。

// 本文轉(zhuǎn)自 武林網(wǎng)VEVB - http://www.conghuacea.com/article/

空間大小:一般來講在32位系統(tǒng)下,堆內(nèi)存可以達(dá)到4G的空間,從這個(gè)角度來看堆內(nèi)存幾乎是沒有什么限制的。但是對于棧來講,一般都是有一定的空間大小的,例如,在VC6下面,默認(rèn)的棧空間大小是1M(好像是,記不清楚了)。當(dāng)然,我們可以修改:

打開工程,依次操作菜單如下:

Project->Setting->Link,在Category 中選中Output,然后在Reserve中設(shè)定堆棧的最大值和commit。

注意:reserve最小值為4Byte;commit是保留在虛擬內(nèi)存的頁文件里面,它設(shè)置的較大會(huì)使棧開辟較大的值,可能增加內(nèi)存的開銷和啟動(dòng)時(shí)間。

碎片問題:對于堆來講,頻繁的new/delete勢必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對于棧來講,則不會(huì)存在這個(gè)問題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出,在他彈出之前,在他上面的后進(jìn)的棧內(nèi)容已經(jīng)被彈出,詳細(xì)的可以參考數(shù)據(jù)結(jié)構(gòu),這里我們就不再一一討論了。

生長方向:對于堆來講,生長方向是向上的,也就是向著內(nèi)存地址增加的方向;對于棧來講,它的生長方向是向下的,是向著內(nèi)存地址減小的方向增長。

分配方式:堆都是動(dòng)態(tài)分配的,沒有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動(dòng)態(tài)分配由 alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無需我們手工實(shí)現(xiàn)。

分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(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)行返回。顯然,堆的效率比棧要低得多。

從這里我們可以看到,堆和棧相比,由于大量new/delete的使用,容易造成大量的內(nèi)存碎片;由于沒有專門的系統(tǒng)支持,效率很低;由于可能引發(fā)用戶態(tài)和核心態(tài)的切換,內(nèi)存的申請,代價(jià)變得更加昂貴。所以棧在程序中是應(yīng)用最廣泛的,就算是函數(shù)的調(diào)用也利用棧去完成,函數(shù)調(diào)用過程中的參數(shù),返回地址,EBP和局部變量都采用棧的方式存放。所以,我們推薦大家盡量用棧,而不是用堆。

雖然棧有如此眾多的好處,但是由于和堆相比不是那么靈活,有時(shí)候分配大量的內(nèi)存空間,還是用堆好一些。

無論是堆還是棧,都要防止越界現(xiàn)象的發(fā)生(除非你是故意使其越界),因?yàn)樵浇绲慕Y(jié)果要么是程序崩潰,要么是摧毀程序的堆、棧結(jié)構(gòu),產(chǎn)生以想不到的結(jié)果,就算是在你的程序運(yùn)行過程中,沒有發(fā)生上面的問題,你還是要小心,說不定什么時(shí)候就崩掉,那時(shí)候debug可是相當(dāng)困難的。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产91欧美| 国产日韩电影| 亚洲理论中文字幕| 交视频在线观看国产| 欧美日韩一二三| 亚洲综合在线小说| 一区二区三区免费看视频 | 91精品国产91久久久久青草| 91精品久久久久久久久久入口| 亚洲福利一区| 亚洲黄色在线观看| 91精品国产91久久久久久久久| 免费精品国产自产拍观看| 国产免费久久久| 日韩免费不卡avV| 国产不卡在线观看视频| www.久久草| 国产成人综合av| 丰满少妇一区| 欧美日韩精品免费看| 日韩欧美999| 1区2区3区在线视频| 蜜桃久久av| 黄色资源在线观看| 91精品999| av丝袜在线| 日韩高清不卡一区| 精品视频999| 99pao成人国产永久免费视频| 中文字幕国产欧美| www.中文字幕在线| 日韩www在线| 精品色蜜蜜精品视频在线观看 | 日本免费在线视频不卡一不卡二| 欧美三级三级三级爽爽爽| 成人h视频在线观看| 国产欧美综合在线| 黄色在线播放网站| 中文国产字幕在线观看| 精品三区视频| 国产黄在线看| 一级片在线播放| 中文不卡在线| 精品av中文字幕在线毛片| 91一区二区| 午夜成人鲁丝片午夜精品| 日本不卡一区在线| 国产在线观看91| 国产在线精品国自产拍免费| 日韩欧美一卡二卡| 亚洲高清视频在线| 日韩在线视频免费观看| 亚洲高清不卡一区| 深夜日韩欧美| 正在播放日韩精品| 久久婷婷亚洲| 亚洲视频在线观看日本a| 亚洲综合日韩欧美| 中文字幕在线国产| 欧美日韩国产999| 亚洲欧美999| 中文字幕日韩国产| 中文字幕乱码在线| 中文字幕欧美日韩va免费视频| 欧美一级搡bbbb搡bbbb| 国产99在线|亚洲| 中文字幕国产日韩| 久久精品久久精品国产大片| 日韩wumaV| 欧美日韩亚洲国内综合网| 国产在线小视频| 国产日韩在线视频| 亚洲综合中文字幕在线| 欧美日韩综合在线免费观看| 在线国产91| 一区三区视频| 视频一区二区国产| 日韩影院二区| 久久久精品日韩| 久久蜜桃精品| 久久精品免费在线观看| 欧美日韩国产免费观看视频| 免费一级欧美在线观看视频| av免费观看网站| 福利在线国产| 日本精品在线播放| 成人久久在线| 国产日韩中文字幕| 国产亚洲人成a一在线v站| 国产午夜精品久久| 91吃瓜在线观看| 亚洲欧洲精品在线| 亚洲第一中文字幕| 一区二区中文字幕在线| 日韩欧美999| 日韩欧美亚洲国产| 在线视频不卡一区二区| 欧美日韩在线播放一区| 欧美日韩国产免费观看视频| 欧洲精品在线视频| 欧美日韩午夜精品| 中文字幕久精品免费视频| 欧美日韩国产页| 中文字幕亚洲高清| 日韩国产91| 亚洲黄在线观看| 国产婷婷精品| 午夜伦欧美伦电影理论片| 欧美日韩中文另类| 日韩在线观看一区| 欧美三级中文字幕| 欧美日韩国产免费| 91精品国产91久久久久久青草| 精品网站999www| 欧美日韩中文字幕| 中文字幕最新精品| 精品极品三级久久久久| 欧美中文字幕视频| 欧美精选午夜久久久乱码6080| 本道综合精品| 日韩中文字幕久久| av免费网站在线| 亚洲第一页中文字幕| 国产91久久久久| 在线一区二区三区精品| 免费看日韩精品| 亚洲综合视频一区| 久草亚洲一区| 欧美日韩国产免费观看| 一区二区三区久久| 久久久精品网| 久久99久久久久久久噜噜| 欧美日韩国产三级| 色欧美日韩亚洲| 一区二区三区视频网站| 亚洲一区资源| 美女在线视频一区| 欧美日韩午夜在线| 韩国av一区二区| 久久精品国产91精品亚洲 | 国产黄色小视频| 中文字幕亚洲免费| 国产一区成人| 国产真实乱子伦精品视频| 久本草在线中文字幕亚洲欧美| 欧美日韩国产一级片| 一级国产黄色片| 国产亚洲欧美中文| 日韩精品视频在线免费观看| 视频一区视频二区中文| 色99中文字幕| 国产在线看一区| 天堂在线中文| 久久综合久久综合九色| 国产在线不卡av| 自拍日韩亚洲一区在线| 国产欧美日韩在线| 中文字幕欧美日韩va免费视频| 精品国自产在线观看| 欧美三级免费观看| 国产91欧美| www.中文字幕在线观看| 国产主播中文字幕| 国产高清精品二区| 国产区高清在线| 日韩在线二区| 久久蜜桃精品| 欧美日韩国产片| 被陌生人带去卫生间啪到腿软| 亚洲午夜av| 欧美亚洲国产日韩2020| 视频一区视频二区中文| 精品国产999| 国产一卡2卡3卡四卡网站| 国产欧美日韩91| 亚洲综合在线视频| 91精品综合久久| 精品一二三区视频| av中文网站| 日韩视频专区| 久久精品国产视频| 91久久精品国产91久久| 欧美久久在线观看| 亚洲一区在线观看网站| 中文字幕日韩在线观看| 日韩精品视频免费在线观看| 欧美日韩高清不卡| 亚洲3区在线| 黄色国产在线| 天天综合天天| 精品日韩99亚洲| 婷婷精品进入| 日韩欧美国产高清| 精品国产1区二区| 77777_亚洲午夜久久多人| av中文资源在线| 日韩中文字幕视频网| av免费看在线| 免费在线视频一区二区| 亚洲一区日韩精品中文字幕| 欧美精选午夜久久久乱码6080| 精品视频久久| av中文天堂在线| 日韩欧美在线网址| 国产在线高清精品| 国产欧美 在线欧美| 亚洲小说春色综合另类电影| 国产成人精品免费网站| 国产成人一区二区精品非洲| 日韩精品视频在线看| 国产福利免费观看| 精品久久蜜桃| 精品精品久久| 亚洲欧洲综合另类| 欧美午夜精品在线| 精品人妻一区二区免费视频| 欧美日韩在线播放一区| 在线视频不卡一区二区| 国产精久久久久| 日韩中文欧美| 精品日韩在线| 欧美三级精品| 国产区视频在线观看| 亚洲 欧美 日韩系列| 91精品久久久久久久91蜜桃| 国产黄色精品| 国产无遮挡在线视频免费观看| 91久久精品视频| 一区在线播放视频| 久久精品国产91精品亚洲 | 日韩欧美综合视频| 中文字幕在线播出| 日本a口亚洲| 国产福利三区| 日韩不卡在线观看| 蜜桃久久久久| 亚洲一级网站| 欧美日韩国产片| 国产无遮挡在线视频免费观看| 国产在线精品国自产拍免费| 国产 中文 字幕 日韩 在线| 欧美日韩性视频| 一区免费视频| 亚洲一区视频在线观看视频| 一二三区精品福利视频| 日韩欧美在线网站| 国产欧美久久久精品影院| av三级在线观看| 国产午夜精品久久| 国产欧美综合在线| 日韩精品视频中文字幕| 中文字幕日韩在线观看| 在线综合 亚洲 欧美中文字幕| 国产一级一片免费播放| www.av中文字幕| 国产传媒久久久| 国产日韩av一区二区| 亚洲国产综合久久| 国产日韩精品在线观看| 欧美 日韩 国产在线| 日韩福利视频导航| 国产在成人精品线拍偷自揄拍| 中文字幕2020第一页| 精品亚洲永久免费| 高清一区二区| 日韩免费视频一区二区视频在线观看 | 精品欧美日韩精品| 国产欧美日韩中文字幕在线| 欧美日韩亚洲国内综合网俺| 91精品视频播放| 在线观看国产福利视频| 久久久99久久| 亚洲高清视频在线| 日韩免费视频| 久久精品国产91精品亚洲| 日韩精品在线免费看| 日韩三级视频在线播放| 一区二区三区精品久久久| 欧美日韩国产123区| 日韩欧美专区在线| 欧美日韩国产123区| 亚洲国产欧美日韩在线| 99视频精品全国免费| 日韩精品视频在线观看视频| 国产日韩精品在线| 中文字幕精品在线| 日韩欧美综合在线视频| 久久精品在线免费观看| 日韩欧美国产1| 中文官网资源新版中文第二页在线观看 | 日韩.欧美.亚洲| 国产视频97| 亚洲羞羞网站| 国产免费不卡av| 国产农村妇女精品一二区| 一区二区三区在线不卡| 一本大道一区二区三区| 亚洲大胆人体av| 91精品国产91久久| 91精品国产手机| 欧美日韩国产在线观看| 欧美日韩免费精品| 国产日韩三级| 亚洲一区激情| 欧美日韩在线不卡一区| 亚洲视频 中文字幕| 中文字幕亚洲乱码| 久久激情中文| 欧美婷婷久久| 免费在线视频一区二区| 国产福利免费观看| 日韩中文字幕网| 免费在线观看国产黄| 在线不卡一区二区| 欧美日韩精品在线播放| 男人的天堂网av| 蜜臀久久精品| 97caopor国产在线视频| 一区二区不卡在线播放| 精品日韩视频| 91精品国产综合久久香蕉最新版| 亚洲图片小说综合| 日韩欧美成人一区二区三区| 先锋男人资源站| 精品中文在线| 亚洲女同中文字幕| 99日韩精品| 久久久精品99| 欧美日韩综合在线观看| 日韩高清不卡在线| 91亚洲国产| 国产乱国产乱老熟300| 91精品久久久久久蜜臀| 欧美日韩国产大片| 国产黄色小视频| 在线视频第一页| 欧美另类专区| 久久精品蜜桃| 欧美日韩在线播放一区| 国产黄色片大全| 欧美综合精品| 国产中文伊人| 国产高清一级片| 1024国产在线| 国产第一页在线播放| 激情国产在线| 亚洲一区在线观看视频| 欧美日韩乱国产| 91av久久久| 7799精品视频天天看| 久久久精品免费免费| 日韩国产成人精品| 一级免费a一片| 国产欧美高清在线| 91精品日本| 一区二区三区视频网站| 在线观看91精品国产入口| 亚洲国产欧美久久| 欧美高清视频一区二区三区| 欧美日韩三级在线| 亚洲第一中文字幕| 伊人精品视频| 亚洲免费精品| 日韩精品视频在线| 日韩欧美中文免费| 欧美中文字幕精品| av中文在线资源| 日本va欧美va精品发布| 欧美日韩亚洲一区| 亚洲免费精品| 99精品在线播放| 日韩欧美亚洲视频| 亚洲综合日韩欧美| 久久综合久久综合九色| 欧美三级精品| 国产99对白在线播放| 中文字幕亚洲欧美| 日韩精品福利视频| 日韩一级免费在线观看| 日韩av在线中文字幕| 日韩在线中文视频| 精品无人国产偷自产在线| 久久精品不卡| 亚洲欧洲日韩精品在线| 久久久久久99精品| 欧美激情一区二区在线| 久久99精品国产| 91精品国产综合久久久久久| 国产激情在线播放| 一区二区在线高清视频| 欧美1234区| 国产91大片| 日韩精品视频在线播放| 一区二区不卡视频| 欧美日韩一级片在线观看| 91精品久久久久久久91蜜桃| 欧美成人二区| av中文资源在线| 九一精品国产| 国产欧美中文字幕|