• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 堆和棧 的區別

    發表于:2007-05-26來源:作者:點擊數: 標簽:
    哪些變量會在棧中分配空間,哪些變量會在堆中分配空間? 1.申請方式 stack: 由系統自動分配。 例如,聲明在函數中一個局部變量 int b; 系統自動在棧中為b開辟空間 heap: 需要程序員自己申請,并指明大小,在c中malloc函數 如p1 = (char *)malloc(10); 在C++中

    clearcase/" target="_blank" >cc">哪些變量會在棧中分配空間,哪些變量會在堆中分配空間?  

     
     
    1.申請方式    
    stack:    
    由系統自動分配。  例如,聲明在函數中一個局部變量  int  b;  系統自動在棧中為b開辟空間    
    heap:    
    需要程序員自己申請,并指明大小,在c中malloc函數    
    如p1  =  (char  *)malloc(10);    
    在C++中用new運算符    
    如p2  =  (char  *)malloc(10);    
    但是注意p1、p2本身是在棧中的。    
     
     
    2  申請后系統的響應    
     
    棧:只要棧的剩余空間大于所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。    
    堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,    
    會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結點,然后將該結點從空閑結點鏈表中刪除,并將該結點的空間分配給程序,另外,對于大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由于找到的堆結點的大小不一定正好等于申請的大小,系統會自動的將多余的那部分重新放入空閑鏈表中。    
     
    3.申請大小的限制    
    棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。    
    堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。    
     
     
    4.申請效率的比較:    
    棧由系統自動分配,速度較快。但程序員是無法控制的。    
    堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.    
    另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內存,雖然用起來最不方便。但是速度快,也最靈活。    
     
    5.堆和棧中的存儲內容    
    棧:  在函數調用時,第一個進棧的是主函數中后的下一條指令(函數調用語句的下一條可執行語句)的地址,然后是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然后是函數中的局部變量。注意靜態變量是不入棧的。    
    當本次函數調用結束后,局部變量先出棧,然后是參數,最后棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。    
    堆:一般是在堆的頭部用一個字節存放堆的大小。堆中的具體內容有程序員安排。    
     
    6.存取效率的比較    
     
    char  s1[]  =  "aaaaaaaaaaaaaaa";    
    char  *s2  =  "bbbbbbbbbbbbbbbbb";    
    aaaaaaaaaaa是在運行時刻賦值的;    
    而bbbbbbbbbbb是在編譯時就確定的;    
    但是,在以后的存取中,在棧上的數組比指針所指向的字符串(例如堆)快。    
    比如:    
    #include    
    void  main()    
    {    
    char  a  =  1;    
    char  c[]  =  "1234567890";    
    char  *p  ="1234567890";    
    a  =  c[1];    
    a  =  p[1];    
    return;    
    }    
    堆和棧的區別可以用如下的比喻來看出:    
    使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。    
    使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。    
     
    ---------------------------------------------------------------  
     
    局部變量,函數形參是存儲在棧上的,由系統幫你管理  
    程序員通過new分配的內存,是在堆上的,要由自己用delete來釋放  
    ---------------------------------------------------------------  
     
    動態分配的內存在堆里。  
    ---------------------------------------------------------------  
     
     
    棧是系統自動為之分配的,例如當在調用涵數時,需要保存的變量,最明顯的是在遞歸調用時,要系統自動分配一個棧的空間,后進先出的,而后又由系統釋放這個空間,  
    堆是自已申請自已釋放,如p1  =  (char  *)malloc(10);    
    在C++中用new運算符    
    如p2  =  (char  *)malloc(10);    
    棧:只要棧的剩余空間大于所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。    
    堆:首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,    
    會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結點,然后將該結點從空閑結點鏈表中刪除,并將該結點的空間分配給程序,另外,對于大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由于找到的堆結點的大小不一定正好等于申請的大小,系統會自動的將多余的那部分重新放入空閑鏈表中。  
    ---------------------------------------------------------------  
     

    ??梢詳U大  
    vc  編譯選項中可以設置,其實就是一個    /STACK參數  
     
    缺省2M  
    ---------------------------------------------------------------  
     
    ??臻g的分配通常要受到操作系統的限制,因為棧的分配是從高地址到底地址;而堆空間的分配是從底地址到高地址,所以一般不會受到限制。雖然棧的空間有限,但是其訪問速度比堆快,而堆的使用更為靈活...  
    ---------------------------------------------------------------  
     
    堆和棧其實是兩種數據結構……  
     
    只不過系統的進程空間管理引用了這兩種結構,所以空間被分成了堆和?!? 
    ---------------------------------------------------------------  
     
    堆和棧  的區別在哪里?  
    ======================================================================================  
    堆和棧是編譯器劃分的內存空間。  
     
    棧上分配的內存,編譯器會自動收回;堆上分配的內存,要通過free來顯式地收回。  
     
     
    哪些變量會在棧中分配空間,哪些變量會在堆中分配空間?  
    =======================================================  
    函數局部變量、參數,一些臨時對象都在棧中分配空間。  
     
    用malloc、calloc等申請的內存在堆中分配。

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>