程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話之棧和堆(Stack && Heap)的優缺陷及其應用差別

C說話之棧和堆(Stack && Heap)的優缺陷及其應用差別

編輯:關於C++

C說話之棧和堆(Stack && Heap)的優缺陷及其應用差別。本站提示廣大學習愛好者:(C說話之棧和堆(Stack && Heap)的優缺陷及其應用差別)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話之棧和堆(Stack && Heap)的優缺陷及其應用差別正文


1、媒介

     直到如今,我們曾經曉得了我們若何聲明常量類型,例如int,double,等等,還有龐雜的例如數組和構造體等。我們聲明他們有各類說話的語法,例如Matlab,Python等等。在C說話中,把這些變量放在棧內存中。

2、基本

     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( )調劑
例如:    
          上面是一個在棧上創立變量的短法式。和我們看到的其他法式相似

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


  
 運轉成果以下: double your salary is 24691.340
    

在第7,8和9行,我們聲清楚明了三個變量:一個int變量、一個double變量和一個包括三個包括double的數組。這三個變量在main()函數創立,被壓入棧中。當main()函數加入(法式加入),這些變量就會出棧。異樣地,在multiplyByTwo函數中,第二個double變量,也會在multiplyByTwo()函數創立的時刻壓入棧中。一旦函數加入,第二個變量就會出棧,永久地消逝。
    

備注:有一種辦法可以告知C堅持一個棧變量。即便它的創立函數加入。那就是用static症結字當聲明變量的時刻。一個變量用static症結之聲明,是以就會釀成一個相似與全局變量的器械。然則它僅僅在創立它的函數外面可見。這是一個奇異的器械,除非你在一個異常特別的情形下須要。
    

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

#include <stdio.h>
#include <stdlib.h>
 
double *multiplyByTwo (double *input) {
 double *twice = malloc(sizeof(double));
 *twice = *input *2.0;
 return twice;
}
int main(int argc, const char * argv[]) {
 int *age = malloc(sizeof(int));
 *age = 30;
 double *salary = malloc(sizeof(double));
 *salary = 12345.67;
 double *myList = malloc(3 * sizeof(double));
 myList[0] = 1.2;
 myList[1] = 3.4;
 myList[2] = 4.5;
 double *twiceSalary = multiplyByTwo(salary);
 
 printf("double your salary is %.3f\n",*twiceSalary);
 
 free(age);
 free(salary);
 free(myList);
 free(twiceSalary);
 
 return 0;
}

  
正如你所看到的,我們用malloc()去分派堆內存,用free()去釋放它。如許不是很年夜的處置,然則很粗笨。還有一件要留意的工作是:如許會由許多*號。這些是指針。malloc()(calloc()和free())函數處置的是指針而不是真實的數值。我們將會鄙人邊評論辯論指針。指針在C棧是一個特別的數據類型,它用來存儲內存的地址而不是存儲現實的values.是以在

*twice = *input *2.0;


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

4、甚麼時刻應用堆
    

       我們應當甚麼時刻應用堆和棧呢?假如我們須要分派一年夜塊內存(例如一個很年夜的數組或許一個很年夜的構造體),並且我們須要堅持這個變量很長時光(例如全局變量)。我們應當分派堆內存。假如你處置的很小的變量,並且只需再函數應用的時刻存活,那末你應當應用棧,它比擬便利並且快捷。假如你須要相似與數組或許構造體的變量,並且可以或許靜態轉變年夜小(例如一個數組可以依據須要添加數據或許刪除數據),那末你可以用malloc(),realloc()給他們分派堆內存,用free()手動的治理內存。當我們評論辯論完指針,我們將會評論辯論靜態分派數據構造體。

經由過程以上對棧和堆的引見,願望對年夜家懂得和辨別棧和堆有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved