国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

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

C語言之棧和堆(Stack Heap)的優缺點及其使用區別

2020-05-23 14:17:38
字體:
來源:轉載
供稿:網友

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

一、前言

直到現在,我們已經知道了我們如何聲明常量類型,例如int,double,等等,還有復雜的例如數組和結構體等。我們聲明他們有各種語言的語法,例如Matlab,Python等等。在C語言中,把這些變量放在棧內存中。

二、基礎

1、棧

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

用棧存儲變量的好處是,內存是被你管理的。你不用手動的創建內存,不用當你不在需要它的時候手動釋放內存。另外,由于CPU組織棧內存很高效。讀出和寫入棧變量是很快的。

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

關于棧的另一個特點我們應該記住,就是存儲再棧中的變量的大小有限制。而堆上創建變量不用考慮。

總結棧:

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

b、我們不用自己去管理內存,變量創建和釋放都是自動的。

c、棧中的變量只有在函數創建運行時存在。

2、 堆

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

不像棧,堆沒有變量大小的限制(除了你電腦的物理限制條件外)。堆內存讀出和寫入都比較慢,因為它必須使用指針圖訪問堆內存。我們將會下面講解指針。

3、棧和堆的優缺點

棧:

a、快速訪問。

b、沒有必要明確的創建分類變量,因為它是自動管理的。

c、空間被CPU高效地管理著,內存不會變成碎片。

d、只有局部變量

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

f、變量不能調整大小。

堆:

a、變量可以被全局訪問

b、沒有內存大小限制

c、(相對)訪問比較慢

d、沒有高效地使用空間,隨著塊內存的創建和銷毀,內存可能會變成碎片。

e、你必須管理內存(變量的創建和銷毀你必須要負責)

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

例如:

下面是一個在棧上創建變量的短程序。和我們看到的其他程序類似

 

 
  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

運行結果如下:

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

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

下面是另一個版本的創建變量在堆上而不是在棧上:

 

 
  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()去分配堆內存,用free()去釋放它。這樣不是很大的處理,但是很笨重。還有一件要注意的事情是:這樣會由很多*號。這些是指針。malloc()(calloc()和free())函數處理的是指針而不是真正的數值。我們將會在下邊討論指針。指針在C棧是一個特殊的數據類型,它用來存儲內存的地址而不是存儲實際的values.因此在

 

 
  1. *twice = *input *2.0; 

這行,twice變量不是一個double,而是一個指向double的指針,是double被存儲再內存中的地址。

4、什么時候使用堆

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产在线观看网站| av网站在线播放| 毛片视频免费观看| 中文字幕毛片| 在线观看免费高清完整| av福利在线| av在线播放网| 国产精品综合久久久久| 午夜视频在线| wwwww在线观看免费视频| 大香伊人中文字幕精品| 91在线网址| 国产精品视频二区三区| 久久综合第一页| 国产青草视频在线观看视频| 国产九九九九| 国产在线观看网站| 91福利在线免费| 国产嫩草在线视频| 99高清免费国产自产拍| 国产三区在线观看| 免费观看一二区视频网站| 久久一本精品| 国产激情三区| 国产精品黄页网站在线播放免费| 国产精品视频一区二区三区麻豆| 国产综合视频一区二区三区免费| 亚洲网站一区| 国产视频三区| 日本视频在线观看一区二区三区| 在线观看av中文| 国产精品视频流白浆免费视频| 国产嫩草在线视频| 亚洲久草视频| 91午夜在线| 国产在线更新| 国产一级在线| 国产精美视频| 九色成人在线| 99久久99久久免费精品小说| www.色五月| sese在线视频| 国产一级黄色电影| 国产麻豆精品入口在线观看| 国产不卡精品一区二区三区| 免费观看v片在线观看| 96精品视频| 国产美女一区视频| av福利在线播放| 国产免费高清| 国产成人精品实拍在线| 91免费日韩| 国产有码在线| 亚洲精品影视在线| 国产精品四虎| 国产网红在线观看| 亚洲伊人网在线观看| 日韩亚洲一区中文字幕| 国产麻豆免费| 成人超碰在线| 国产中文在线视频| 亚洲精品一线| www.操操| 天天操天天曰| 中文字幕在线第一页| 国产高清在线观看| 女同一区二区免费aⅴ| 九色福利视频| 青青免费在线视频| 一色桃子av在线| 国产精品日日爱| 国产精品va在线观看视色| 国产网友自拍视频导航网站在线观看| 国产探花视频在线观看| www.av在线| 狠狠干天天爱| 国产一级又黄| 2018中文字幕在线观看| 国产一级电影网| 国产精品视频一区麻豆| 国产超碰精品在线观看| 国产盗摄一区二区| 国产成人精品久久一区二区小说 | 国产精品免费91| 色欧美在线观看| www.三区| 在线伊人免费视频| 永久免费av片在线观看全网站| 最好2018中文免费视频| 精品日韩av| 日本亚洲欧美| 九九在线观看免费视频| 国产高清视频在线观看| 中文字幕久热在线精品| 国产午夜视频在线观看| 国产网站在线免费观看| 午夜视频在线看| 国产九色在线| 六月天色婷婷| 精品一区二区三区高清免费不卡| 国产一区二区三区不卡免费观看| 欧美精品另类| 国产二区三区在线| 国产精品秘入口| 国产乱精品一区二区三区| 99热99re6国产在线播放| 国产激情在线视频| 久久亚洲国产成人亚| 亚洲免费国产| 中文字幕2019第三页| 国产精品入口免费麻豆| 好看的中文字幕在线播放| 狠狠干天天干| 国产丝袜视频在线播放| 国产国语**毛片高清视频| 国产三级做爰在线观看| 国产成人精品18| 在线观看视频污| 尤物视频在线观看视频| www.夜夜操.com| 欧美精品久久久久久久小说| 欧美艹逼视频| 国产午夜在线| 精品176二区| 亚洲精品aaaa精品| 丁香花高清在线观看完整版 | а√最新版在线天堂| 一本大道久久精品| www在线视频观看| 最近中文字幕av免费高清| 国产天堂在线| 亚洲欧美一区二区三区在线播放| 在线国产小视频| 国产理论电影在线观看| 91在线网站| 国产永久免费高清在线观看| 国产精品麻豆一区二区三区| 国产一级免费| 蜜桃视频中文字幕| 国产激情视频网址| av资源网站在线观看| 国产在线传媒| 亚洲精品aaaa精品| 国产桃色电影在线播放| 欧美黑人乱大交| 在线黄色.com| 国产小视频在线高清播放| 中文在线视频观看| 国产亚洲精品拍拍拍拍拍| 黄网站app在线观看下载视频大全官网| 成人午夜无人区一区二区| av网站大全在线观看| 国产高清一区二区三区视频| 丁香综合五月| 久久久久久77777| 国产精品xxx电影| 国产乱精品一区二区三区| 色综合久久五月天| 伊人国产在线看一| 国产传媒在线播放| 国产三区四区在线观看| 天天操人人爽| 高清av中文在线字幕观看1| 欧美日韩不卡中文字幕在线| 在线免费观看黄色av| 69精品视频| 国产激情自拍| 在线色视频观看| 91桃色在线| 亚洲综合在线不卡| 伊人av免费在线观看| 精品推荐国产麻豆剧传媒| 2019年中文字幕| av色在线观看| 欧美精品小视频| 国产中文字幕第一页| 最新中文字幕在线视频| 91av资源在线| 国产成人亚洲精品播放器下载| 国产精品18久久久久久久久久| 国产一级片麻豆| 中文资源在线官网| jlzzjlzz欧美大全| 国产麻豆视频网站| 国产精品理人伦一区二区三区| 国产一区在线视频观看| 国产丝袜精品丝袜| 精品国产福利一区二区在线| 国产色婷婷在线| 亚洲精品视频在线免费| 免费黄色网页在线观看| 国产一区二区影视| 亚洲国产aⅴ精品| 激情网站在线| 国产高清在线看| 国产在线拍揄自揄拍视频| 国产aa视频| 九九热视频免费观看| 国产一级二级三级在线观看| 97在线超碰|