亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

C語言之棧和堆(Stack Heap)的優(yōu)缺點(diǎn)及其使用區(qū)別

2020-05-23 14:17:38
字體:
供稿:網(wǎng)友

本篇文章主要介紹了什么是棧(Stack) 、什么是堆( Heap),以及棧和堆的優(yōu)缺點(diǎn),同時(shí)介紹了應(yīng)該什么時(shí)候使用堆和棧,有需要的朋友可以參考下

一、前言

直到現(xiàn)在,我們已經(jīng)知道了我們?nèi)绾温暶鞒A款愋?,例如int,double,等等,還有復(fù)雜的例如數(shù)組和結(jié)構(gòu)體等。我們聲明他們有各種語言的語法,例如Matlab,Python等等。在C語言中,把這些變量放在棧內(nèi)存中。

二、基礎(chǔ)

1、棧

什么是棧,它是你的電腦內(nèi)存的一個(gè)特別區(qū)域,它用來存儲(chǔ)被每一個(gè)function(包括mian()方法)創(chuàng)建的臨時(shí)變量。棧是FILO,就是先進(jìn)后出原則的結(jié)構(gòu)體,它密切的被CPU管理和充分利用。每次function聲明一個(gè)新的變量,它就會(huì)被“推”到棧中。然后每次一個(gè)function退出時(shí),所有關(guān)于這個(gè)函數(shù)中定義的變量都會(huì)被釋放(換句話說就是刪除)。一旦棧中的變量釋放,這塊區(qū)域就會(huì)變成可用的,提供給其他棧中的變量。

用棧存儲(chǔ)變量的好處是,內(nèi)存是被你管理的。你不用手動(dòng)的創(chuàng)建內(nèi)存,不用當(dāng)你不在需要它的時(shí)候手動(dòng)釋放內(nèi)存。另外,由于CPU組織棧內(nèi)存很高效。讀出和寫入棧變量是很快的。

理解棧的關(guān)鍵是理解概念,當(dāng)一個(gè)function退出時(shí),所有它的變量都會(huì)從棧中彈出,以后都會(huì)永遠(yuǎn)消失。因此棧中的變量本質(zhì)是局部的。這和我們原來理解為變量作用域或者本地或者全局變量是相關(guān)的。在C中,一個(gè)公共的bug 是從你程序中的一個(gè)function外嘗試訪問一個(gè)在棧中的這個(gè)function的變量(在該function已經(jīng)退出后)。

關(guān)于棧的另一個(gè)特點(diǎn)我們應(yīng)該記住,就是存儲(chǔ)再棧中的變量的大小有限制。而堆上創(chuàng)建變量不用考慮。

總結(jié)棧:

a、棧的生長和伸縮就是函數(shù)壓入或者推出局部變量。

b、我們不用自己去管理內(nèi)存,變量創(chuàng)建和釋放都是自動(dòng)的。

c、棧中的變量只有在函數(shù)創(chuàng)建運(yùn)行時(shí)存在。

2、 堆

堆也是我們的計(jì)算機(jī)內(nèi)存中的一個(gè)區(qū)域,但是他不是自動(dòng)管理的。而且也不是被CPU密切的管理著。它是一片更加自由的內(nèi)存區(qū)域(很大)。要想在堆上創(chuàng)建內(nèi)存,我們必須使用malloc() 或者calloc(),他們都是C語言編譯的。一旦你在堆上分配內(nèi)存,當(dāng)你不在需要的時(shí)候你必須用free()去銷毀。如果你不銷毀或者銷毀失敗,你的程序就會(huì)有內(nèi)存泄露。換句話說就是堆內(nèi)存會(huì)一直在,其他進(jìn)程無法使用。我們將會(huì)再調(diào)試部分看到,那里有一個(gè)叫做Valgrind的東西,它可以幫助你發(fā)現(xiàn)內(nèi)存泄露。

不像棧,堆沒有變量大小的限制(除了你電腦的物理限制條件外)。堆內(nèi)存讀出和寫入都比較慢,因?yàn)樗仨毷褂弥羔槇D訪問堆內(nèi)存。我們將會(huì)下面講解指針。

3、棧和堆的優(yōu)缺點(diǎn)

棧:

a、快速訪問。

b、沒有必要明確的創(chuàng)建分類變量,因?yàn)樗亲詣?dòng)管理的。

c、空間被CPU高效地管理著,內(nèi)存不會(huì)變成碎片。

d、只有局部變量

e、受限于棧大小(取決于操作系統(tǒng))

f、變量不能調(diào)整大小。

堆:

a、變量可以被全局訪問

b、沒有內(nèi)存大小限制

c、(相對)訪問比較慢

d、沒有高效地使用空間,隨著塊內(nèi)存的創(chuàng)建和銷毀,內(nèi)存可能會(huì)變成碎片。

e、你必須管理內(nèi)存(變量的創(chuàng)建和銷毀你必須要負(fù)責(zé))

f、變量大小可以用realloc( )調(diào)整

例如:

下面是一個(gè)在棧上創(chuàng)建變量的短程序。和我們看到的其他程序類似

 

 
  1. #include <stdio.h> 
  2. double multiplyByTwo (double input) { 
  3. double twice = input * 2.0; 
  4. return twice; 
  5. int main(int argc, const char * argv[]) { 
  6. int age = 30; 
  7. double salary = 12345.67; 
  8. double myList[3] = {1.2,2.3,3.4}; 
  9. printf("double your salary is %.3f/n",multiplyByTwo(salary)); 
  10. return 0; 

double your salary is 24691.340

運(yùn)行結(jié)果如下:

在第7,8和9行,我們聲明了三個(gè)變量:一個(gè)int變量、一個(gè)double變量和一個(gè)包含三個(gè)包含double的數(shù)組。這三個(gè)變量在main()函數(shù)創(chuàng)建,被壓入棧中。當(dāng)main()函數(shù)退出(程序退出),這些變量就會(huì)出棧。同樣地,在multiplyByTwo函數(shù)中,第二個(gè)double變量,也會(huì)在multiplyByTwo()函數(shù)創(chuàng)建的時(shí)候壓入棧中。一旦函數(shù)退出,第二個(gè)變量就會(huì)出棧,永遠(yuǎn)地消失。

備注:有一種方法可以告訴C保持一個(gè)棧變量。即使它的創(chuàng)建函數(shù)退出。那就是用static關(guān)鍵字當(dāng)聲明變量的時(shí)候。一個(gè)變量用static關(guān)鍵之聲明,因此就會(huì)變成一個(gè)類似與全局變量的東西。但是它僅僅在創(chuàng)建它的函數(shù)里面可見。這是一個(gè)奇怪的東西,除非你在一個(gè)非常特殊的情況下需要。

下面是另一個(gè)版本的創(chuàng)建變量在堆上而不是在棧上:

 

 
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3.  
  4. double *multiplyByTwo (double *input) { 
  5. double *twice = malloc(sizeof(double)); 
  6. *twice = *input *2.0; 
  7. return twice; 
  8. int main(int argc, const char * argv[]) { 
  9. int *age = malloc(sizeof(int)); 
  10. *age = 30; 
  11. double *salary = malloc(sizeof(double)); 
  12. *salary = 12345.67; 
  13. double *myList = malloc(3 * sizeof(double)); 
  14. myList[0] = 1.2; 
  15. myList[1] = 3.4; 
  16. myList[2] = 4.5; 
  17. double *twiceSalary = multiplyByTwo(salary); 
  18.  
  19. printf("double your salary is %.3f/n",*twiceSalary); 
  20.  
  21. free(age); 
  22. free(salary); 
  23. free(myList); 
  24. free(twiceSalary); 
  25.  
  26. return 0; 

正如你所看到的,我們用malloc()去分配堆內(nèi)存,用free()去釋放它。這樣不是很大的處理,但是很笨重。還有一件要注意的事情是:這樣會(huì)由很多*號。這些是指針。malloc()(calloc()和free())函數(shù)處理的是指針而不是真正的數(shù)值。我們將會(huì)在下邊討論指針。指針在C棧是一個(gè)特殊的數(shù)據(jù)類型,它用來存儲(chǔ)內(nèi)存的地址而不是存儲(chǔ)實(shí)際的values.因此在

 

 
  1. *twice = *input *2.0; 

這行,twice變量不是一個(gè)double,而是一個(gè)指向double的指針,是double被存儲(chǔ)再內(nèi)存中的地址。

4、什么時(shí)候使用堆

我們應(yīng)該什么時(shí)候使用堆和棧呢?如果我們需要分配一大塊內(nèi)存(例如一個(gè)很大的數(shù)組或者一個(gè)很大的結(jié)構(gòu)體),而且我們需要保持這個(gè)變量很長時(shí)間(例如全局變量)。我們應(yīng)該分配堆內(nèi)存。如果你處理的很小的變量,而且只要再函數(shù)使用的時(shí)候存活,那么你應(yīng)該使用棧,它比較方便而且快捷。如果你需要類似與數(shù)組或者結(jié)構(gòu)體的變量,而且能夠動(dòng)態(tài)改變大小(例如一個(gè)數(shù)組可以根據(jù)需要添加數(shù)據(jù)或者刪除數(shù)據(jù)),那么你可以用malloc(),realloc()給他們分配堆內(nèi)存,用free()手動(dòng)的管理內(nèi)存。當(dāng)我們討論完指針,我們將會(huì)討論動(dòng)態(tài)分配數(shù)據(jù)結(jié)構(gòu)體。

通過以上對棧和堆的介紹,希望對大家了解和區(qū)分棧和堆有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
在线日本成人| 日韩精品三区四区| 最新国产精品精品视频| 亚洲韩国一区二区三区| 国产日韩中文字幕在线| 成人免费毛片网| 综合久久成人| 欧美一区二区三区四区夜夜大片| 大尺度在线观看| 天天天干夜夜夜操| 色欲色香天天天综合网www| 久久久精品久久久久久96| 91久久一区二区| 欧美日韩成人一区| 亚洲av片在线观看| 二区视频在线| 99日韩精品| 亚洲天堂男人天堂女人天堂| 亚洲综合不卡| 免费不卡亚洲欧美| 色999国产精品| 久久综合九色综合97_久久久| 欧美黑人极品猛少妇色xxxxx| 国产精品嫩草影院8vv8| 久久成人这里只有精品| 欧美刺激脚交jootjob| 欧美日韩国产另类不卡| 国产91社区| 日本综合精品一区| 中文字幕久久精品| 香蕉视频国产在线观看| 欧美高清不卡在线| 蜜桃视频成人m3u8| 欧美日韩精品久久久| 人妻互换一二三区激情视频| 国产麻豆电影在线观看| 午夜精品在线看| 啪一啪鲁一鲁2019在线视频| 美女在线一区二区| 福利片免费在线观看| 精品精品国产高清a毛片牛牛| 三上悠亚影音先锋| 国产精品免费久久久久| 又爽又大又黄a级毛片在线视频| 高清国产在线一区| 国产伦精一区二区三区| youjizz国产精品| 精品亚洲国产成人av制服丝袜| 久久aimee| 亚洲a成人v| 亚洲欧美久久| 丰满少妇在线观看网站| 国产在线网站| 91国在线精品国内播放| 少妇高潮一区二区三区99小说| 免费在线精品视频| 久久久久久久久久网站| 2021天堂中文幕一二区在线观| 高清免费观看在线| 91精品国产99久久久久久红楼| 热久久最新网址| 粉嫩av亚洲一区二区图片| 极品国产91在线网站| 免费电影网站在线视频观看福利| 欧美性xxxx极品hd欧美风情| 97国产suv精品一区二区62| 欧美高清视频一区二区三区| 视频三区二区一区| 日韩欧美亚洲国产| 国产乱码精品一品二品| 欧美日韩精品在线观看| youjizzjizz亚洲| 日本 欧美 国产| 久久精品视频网站| 一区视频在线看| 91成人国产| 欧美三级视频在线| 亚洲精品乱码久久久久久按摩观| 成人福利视频在线看| 亚洲一卡二卡三卡| 亚洲欧美亚洲| 校园春色亚洲| 久久久久久久久国产一区| 在线国产情侣| 中文字幕一区二区视频| 日韩一区av在线| 亚洲精品国产日韩| 欧美三级在线看| 最大av网站| 高清av电影| 久久亚洲国产精品成人av秋霞| yw.尤物在线精品视频| 日韩av资源在线播放| 日本精品久久久久| 国产精品伦一区二区三区视频| 久久精品播放| 99久久免费精品国产72精品九九| 国产系列电影在线播放网址| 亚洲 欧美 激情 小说 另类| 欧美日韩在线国产| 黄黄视频在线观看| 黄瓜视频网站| 日本在线视频免费| 三级免费网站| 男女黄床上色视频| 极品蜜桃臀肥臀-x88av| 最近2019年手机中文字幕| 黄色小视频免费看| 99蜜桃臀久久久欧美精品网站| 在线观看日韩www视频免费| 一色屋色费精品视频在线看| 国产精品一区二区三区四区五区| 亚洲精品动态| 91免费在线视频观看| 欧美美女黄视频| 在线精品亚洲一区二区不卡| 最近中文视频在线| 国内外成人免费在线视频| 国产人妖伪娘一区91| 午夜精品一二三区| 免费yellow网站| 亚洲免费伊人电影| 成人一级福利| 91久久青草| 欧美成人久久| 亚洲成人av在线播放| 国产精品视频一区二区三区麻豆| 国产在线免费av| 欧美丝袜在线观看| 日韩情爱电影在线观看| 最新中文字幕日本| 亚洲欧美日韩在线综合| 国产欧美日韩在线视频| 奇米色欧美一区二区三区| 成人免费视频在线观看| 亚洲女同同性videoxma| 精品国产一区二区三区久久久蜜臀| 国偷自产一区二区免费视频| 天海翼女教师无删减版电影| 男人的午夜天堂| 美女搞黄视频在线观看| 国产精品suv一区二区| 国产精品普通话对白| 国产xxxxx视频| www.亚洲免费视频| 亚洲黄色在线观看| 黄色一级大片免费| 国产欧美日韩精品一区二区免费| 丰满人妻一区二区三区大胸| 中文字幕第66页| 粉嫩高潮美女一区二区三区| 欧美xxxxxx| 日韩精品中文字幕有码专区| 国产男女无遮挡猛进猛出| 主播福利视频一区| 国产美女久久| 国产伦精品一区二区三区照片91| 色橹橹高清视频在线播放| 日韩av不卡电影| 色黄视频在线观看| 欧美日韩一区二区视频在线| 欧美日产国产成人免费图片| 激情小说亚洲图片| 免费看日产一区二区三区| 国产毛片毛片毛片毛片毛片毛片| 亚洲免费观看在线观看| 99re亚洲国产精品| 久久国产免费| 亚洲日韩欧美视频一区| а√天堂www在线а√天堂视频| 瑟瑟视频在线看| 午夜精品福利一区二区蜜股av| aa一级黄色片| 成人丝袜18视频在线观看| 91国产精品视频在线观看| 欧美日韩一区二区三区视视频| 欧美一级视频精品观看| www.久久网| 国产精品视频不卡| 日本精品一区二区三区在线观看视频| 91麻豆成人精品国产免费网站| 亚洲一区中文字幕永久在线| 国产精品午夜一区二区三区| 国产精品免费人成网站酒店| 日本免费不卡一区二区| 中文字幕日本在线观看| 成人av男人的天堂| 91免费视频污| 四虎国产精品永久在线国在线| 熟女丰满老熟女熟妇| 伊人久久国产| 国模大尺度视频一区二区| 无国产精品白浆免费视| 天堂电影一区| 国产精品欧美激情在线| 亚洲中文字幕无码av永久| 亚洲福利二区| 亚洲成人久久一区| 777久久久精品| 91福利视频久久久久| 91av在线免费视频| 亚洲第一精品在线观看| 日产福利视频在线观看| 国产av人人夜夜澡人人爽| 自拍亚洲一区欧美另类| 国产精品久久AV无码| 在线精品视频一区二区三四| 免费一区视频| 99精品国产99久久久久久97| 精品一区电影国产| 天海翼视频在线观看| 亚洲性无码av在线| 久久久久亚洲av成人片| 成人午夜视频网站| 久久亚洲春色中文字幕久久久| 亚洲欧美另类在线视频| 影音先锋国产在线资源| 天天超碰亚洲| 亚洲免费中文| 日韩美女视频免费在线观看| 亚洲国产av一区二区三区| 亚洲人成在线免费观看| 亚洲成人高清在线| 欧美一区二区三区久久精品茉莉花| 99re热这里只有精品视频| 国精产品一区一区三区mba下载| 欧美高清性hdvideosex| 九色91国产| 亚欧洲精品视频在线观看| 欧美激情第一页在线观看| 在线免费观看www| 中文字幕一区二区三区波野结| 久久手机免费视频| 欧美挤奶吃奶水xxxxx| 国产欧美自拍一区| 色综合色综合色综合色综合| 久久久99精品免费观看| 国产精品国产三级欧美二区| 日产午夜精品一线二线三线| 一色屋色费精品视频在线看| 日韩电影免费在线看| 先锋a资源在线看亚洲| 亚洲欧美黄色片| 日韩三级视频在线播放| 久久99精品久久久久久水蜜桃| 亚洲一区二区三区四区在线| 45www国产精品网站| 亚洲区 欧美区| 日本中文在线视频| 国产精品一区视频| 99热在线观看免费| 综合在线影院| 精品久久久久久亚洲国产300| 亚洲黄色三级| 欧美国产高跟鞋裸体秀xxxhd| 欧美另类综合| 激情小说亚洲| 狠狠爱免费视频| 久久精品凹凸全集| 日本不卡一区二区三区在线观看| 好看的亚洲午夜视频在线| 欧美国产乱视频| 成人免费无遮挡无码黄漫视频| 美腿丝袜亚洲综合| 亚洲欧美日韩人成在线播放| 欧美老女人性生活| 午夜久久久久久久久久| 人妻少妇一区二区| 国产精品久久久久久免费播放| 最新精品视频| 国产经典视频一区| 欧美xxxx黑人又粗又长| 亚洲高清视频一区二区| 国产精品一卡二卡三卡| 亚洲97在线观看| 婷婷亚洲五月色综合| 日本一卡二卡四卡精品| 91久久香蕉国产日韩欧美9色| 亚洲免费看av| 久久99久久98精品免观看软件| 亚洲欧洲日韩综合二区| 久久久蜜桃一区二区人| 黄色视屏网站在线免费观看| 亚洲第一免费网站| 伊人网综合在线| 伊人网在线免费观看| 色就是色欧美色图| 欧美xxxx黑人又粗又长| 国产亚洲欧洲高清一区| 亚洲欧美日本另类| 亚洲欧美日韩国产中文专区| 日本a级黄色| 国产老头老太做爰视频| japan乱配videos老少配| 真实国产乱子伦对白视频| 91这里只有精品| 久草综合在线视频| 欧美日韩一区二区精品| 在线免费看v片| 亚洲美女av在线| 免费成人网www| 亚洲天堂视频在线播放| 日韩在线一卡二卡| 亚洲国产一区二区三区a毛片| 一个人看的www久久| 亚洲最新永久在线观看| 毛片在线看片| 欧美成人三级| 能看av的网址| 精品入口蜜桃| 国产一区二区在线视频观看| 五月天国产精品| 亚洲网站三级| 日本中文字幕在线免费观看| 台湾佬中文娱乐久久久| 亚洲欧美偷拍卡通变态| 亚洲国产视频a| 黄网在线观看视频| 欧美日韩国产欧| 亚洲天堂日韩av| 欧美一区二区三区日韩| 日韩一区二区三区在线免费观看| 天天色天天看| 欧美日韩在线一二三| 国产亚洲日本欧美韩国| 香蒸焦蕉伊在线| 亚洲欧洲xxxx| www.欧美日本|