青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

堆和棧的區(qū)別(轉(zhuǎn)過無數(shù)次的文章)

一、預備知識—程序的內(nèi)存分配 
  一個由C/C++編譯的程序占用的內(nèi)存分為以下幾個部分 
  1、棧區(qū)(stack)—   由編譯器自動分配釋放   ,存放函數(shù)的參數(shù)值,局部變量的值等。其 
  操作方式類似于數(shù)據(jù)結構中的棧。 
  2、堆區(qū)(heap)   —   一般由程序員分配釋放,   若程序員不釋放,程序結束時可能由OS回 
  收   。注意它與數(shù)據(jù)結構中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。 
  3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲是放在一塊的,初始化的 
  全局變量和靜態(tài)變量在一塊區(qū)域,   未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另 
  一塊區(qū)域。   -   程序結束后由系統(tǒng)釋放。 
  4、文字常量區(qū)   —常量字符串就是放在這里的。   程序結束后由系統(tǒng)釋放 
  5、程序代碼區(qū)—存放函數(shù)體的二進制代碼。 
  
  
  二、例子程序   
  這是一個前輩寫的,非常詳細   
  //main.cpp   
  int   a   =   0;   全局初始化區(qū)   
  char   *p1;   全局未初始化區(qū)   
  main()   
  {   
  int   b;   棧   
  char   s[]   =   "abc";   棧   
  char   *p2;   棧   
  char   *p3   =   "123456";   123456\0在常量區(qū),p3在棧上。   
  static   int   c   =0;   全局(靜態(tài))初始化區(qū)   
  p1   =   (char   *)malloc(10);   
  p2   =   (char   *)malloc(20);   
  分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)。   
  strcpy(p1,   "123456");   123456\0放在常量區(qū),編譯器可能會將它與p3所指向的"123456" 
  優(yōu)化成一個地方。   
  }   
  
  
  二、堆和棧的理論知識   
  2.1申請方式   
  stack:   
  由系統(tǒng)自動分配。   例如,聲明在函數(shù)中一個局部變量   int   b;   系統(tǒng)自動在棧中為b開辟空 
  間   
  heap:   
  需要程序員自己申請,并指明大小,在c中malloc函數(shù)   
  如p1   =   (char   *)malloc(10);   
  在C++中用new運算符   
  如p2   =   new   char[10];   
  但是注意p1、p2本身是在棧中的。   
  
  
  2.2   
  申請后系統(tǒng)的響應   
  棧:只要棧的剩余空間大于所申請空間,系統(tǒng)將為程序提供內(nèi)存,否則將報異常提示棧溢 
  出。   
  堆:首先應該知道操作系統(tǒng)有一個記錄空閑內(nèi)存地址的鏈表,當系統(tǒng)收到程序的申請時, 
  會遍歷該鏈表,尋找第一個空間大于所申請空間的堆結點,然后將該結點從空閑結點鏈表 
  中刪除,并將該結點的空間分配給程序,另外,對于大多數(shù)系統(tǒng),會在這塊內(nèi)存空間中的 
  首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內(nèi)存空間。 
  另外,由于找到的堆結點的大小不一定正好等于申請的大小,系統(tǒng)會自動的將多余的那部 
  分重新放入空閑鏈表中。   
  
  2.3申請大小的限制   
  棧:在Windows下,棧是向低地址擴展的數(shù)據(jù)結構,是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意 
  思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預先規(guī)定好的,在WINDOWS下,棧的大小是2M(也有 
  的說是1M,總之是一個編譯時就確定的常數(shù)),如果申請的空間超過棧的剩余空間時,將 
  提示overflow。因此,能從棧獲得的空間較小。   
  堆:堆是向高地址擴展的數(shù)據(jù)結構,是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來存儲 
  的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小 
  受限于計算機系統(tǒng)中有效的虛擬內(nèi)存。由此可見,堆獲得的空間比較靈活,也比較大。   
  
  
  
  2.4申請效率的比較:   
  棧由系統(tǒng)自動分配,速度較快。但程序員是無法控制的。   
  堆是由new分配的內(nèi)存,一般速度比較慢,而且容易產(chǎn)生內(nèi)存碎片,不過用起來最方便.   
  另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內(nèi)存,他不是在堆,也不是在棧是 
  直接在進程的地址空間中保留一塊內(nèi)存,雖然用起來最不方便。但是速度快,也最靈活。 
    
  
  2.5堆和棧中的存儲內(nèi)容   
  棧:   在函數(shù)調(diào)用時,第一個進棧的是主函數(shù)中后的下一條指令(函數(shù)調(diào)用語句的下一條可 
  執(zhí)行語句)的地址,然后是函數(shù)的各個參數(shù),在大多數(shù)的C編譯器中,參數(shù)是由右往左入棧 
  的,然后是函數(shù)中的局部變量。注意靜態(tài)變量是不入棧的。   
  當本次函數(shù)調(diào)用結束后,局部變量先出棧,然后是參數(shù),最后棧頂指針指向最開始存的地 
  址,也就是主函數(shù)中的下一條指令,程序由該點繼續(xù)運行。   
  堆:一般是在堆的頭部用一個字節(jié)存放堆的大小。堆中的具體內(nèi)容由程序員安排。   
  
  2.6存取效率的比較   
  
  char   s1[]   =   "aaaaaaaaaaaaaaa";   
  char   *s2   =   "bbbbbbbbbbbbbbbbb";   
  aaaaaaaaaaa是在運行時刻賦值的;   
  而bbbbbbbbbbb是在編譯時就確定的;   
  但是,在以后的存取中,在棧上的數(shù)組比指針所指向的字符串(例如堆)快。   
  比如:   
  #include   
  void   main()   
  {   
  char   a   =   1;   
  char   c[]   =   "1234567890";   
  char   *p   ="1234567890";   
  a   =   c[1];   
  a   =   p[1];   
  return;   
  }   
  對應的匯編代碼   
  10:   a   =   c[1];   
  00401067   8A   4D   F1   mov   cl,byte   ptr   [ebp-0Fh]   
  0040106A   88   4D   FC   mov   byte   ptr   [ebp-4],cl   
  11:   a   =   p[1];   
  0040106D   8B   55   EC   mov   edx,dword   ptr   [ebp-14h]   
  00401070   8A   42   01   mov   al,byte   ptr   [edx+1]   
  00401073   88   45   FC   mov   byte   ptr   [ebp-4],al   
  第一種在讀取時直接就把字符串中的元素讀到寄存器cl中,而第二種則要先把指針值讀到 
  edx中,再根據(jù)edx讀取字符,顯然慢了。   
  
  
  2.7小結:   
  堆和棧的區(qū)別可以用如下的比喻來看出:   
  使用棧就象我們?nèi)ワ堭^里吃飯,只管點菜(發(fā)出申請)、付錢、和吃(使用),吃飽了就 
  走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自 
  由度小。   
  使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由 
  度大。   (經(jīng)典!) 


本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/hairetz/archive/2009/04/30/4141043.aspx

posted on 2010-04-10 13:54 micromichael 閱讀(219) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

導航

統(tǒng)計

常用鏈接

留言簿

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产视频一区在线观看| 久久国产日本精品| 久久精品国产一区二区三区| 午夜精品av| 先锋影音国产精品| 欧美伊久线香蕉线新在线| 欧美一级片在线播放| 亚洲影院免费| 久久国产精品亚洲77777| 老**午夜毛片一区二区三区| 美女脱光内衣内裤视频久久影院| 国产曰批免费观看久久久| 国产精品午夜国产小视频| 国产一区二区无遮挡| 亚洲黄色成人久久久| 亚洲欧美日韩一区在线| 毛片基地黄久久久久久天堂| 亚洲精品免费在线播放| 亚洲亚洲精品三区日韩精品在线视频 | 国产精品久久久久天堂| 国内精品久久久久久| 亚洲乱亚洲高清| 午夜伦欧美伦电影理论片| 欧美成人按摩| 亚洲欧美文学| 欧美日韩另类综合| 在线日韩中文字幕| 亚洲欧美综合国产精品一区| 欧美成人精品h版在线观看| 亚洲午夜精品国产| 欧美大片网址| 激情成人av| 午夜在线一区| 一区二区欧美亚洲| 欧美日韩国产在线看| 在线观看日产精品| 久久se精品一区精品二区| 夜夜嗨av色一区二区不卡| 免费一级欧美片在线观看| 国产精品一二三四区| 99视频在线精品国自产拍免费观看 | 中文av一区特黄| 久久综合伊人77777蜜臀| 国产亚洲精品aa午夜观看| 亚洲在线观看免费| 亚洲三级性片| 你懂的国产精品| 在线成人性视频| 久久精品国产综合| 欧美一区二区三区免费观看视频| 国产精品乱码人人做人人爱| 这里只有视频精品| 亚洲国产精品久久91精品| 久久一区二区三区国产精品| 韩日成人在线| 久久中文久久字幕| 久久久国产91| 在线观看福利一区| 欧美成人tv| 蜜臀av一级做a爰片久久| 亚洲人成啪啪网站| 亚洲人成网站精品片在线观看| 麻豆freexxxx性91精品| 亚洲国产精品激情在线观看| 在线视频国内自拍亚洲视频| 久久久久一区二区三区四区| 亚洲性感美女99在线| 日韩午夜电影在线观看| 欧美视频中文字幕| 欧美一二三区精品| 欧美在线播放视频| 在线观看不卡| 最新日韩欧美| 欧美午夜剧场| 久久精品二区| 久久综合电影| 国产精品99久久久久久白浆小说 | 久热精品视频| 亚洲美女福利视频网站| 一区二区三区精品国产| 国产一区二区三区免费不卡| 久久在线视频在线| 欧美黄色成人网| 亚洲欧美在线视频观看| 久久久国产91| 在线亚洲一区观看| 久久福利精品| 亚洲三级影院| 一区二区三区四区五区精品视频| 国产欧美一区二区白浆黑人| 免费看成人av| 国产精品大片| 母乳一区在线观看| 欧美色图一区二区三区| 久久免费视频网| 欧美日韩激情网| 久久久亚洲人| 欧美三级午夜理伦三级中视频| 久久久久成人精品| 欧美日韩国产黄| 麻豆成人综合网| 欧美日韩中文另类| 欧美电影电视剧在线观看| 国产精品久久久久久久久久久久久久| 久热成人在线视频| 国产精品日韩欧美一区二区三区| 免费av成人在线| 国产精品萝li| 亚洲国产清纯| 韩日在线一区| 亚洲无线视频| 99精品国产福利在线观看免费 | 国产精品成人观看视频国产奇米| 久久久久国产一区二区三区四区| 欧美日韩在线播放一区二区| 免费在线看一区| 国产综合av| 亚洲欧美国产精品va在线观看 | 国产精品视频yy9299一区| 蜜桃av噜噜一区| 国产欧美日韩精品在线| 一区二区不卡在线视频 午夜欧美不卡在| 猛男gaygay欧美视频| 亚洲女人天堂av| 国产精品激情偷乱一区二区∴| 久久夜色精品| 国产区亚洲区欧美区| 一本色道久久综合亚洲精品按摩| 亚洲国产一区二区三区在线播| 欧美在线免费看| 久久动漫亚洲| 国产精品丝袜白浆摸在线| 中文一区二区| 亚洲欧美在线免费| 国产精品成人aaaaa网站| 亚洲精品美女91| 亚洲人在线视频| 开心色5月久久精品| 欧美成人免费视频| 亚洲国产一区二区精品专区| 久久在线免费观看视频| 欧美成人精品三级在线观看 | 亚洲精品视频在线| 女同性一区二区三区人了人一| 鲁大师成人一区二区三区| 影院欧美亚洲| 男人的天堂亚洲在线| 91久久精品日日躁夜夜躁欧美| 99在线精品观看| 国产精品高清网站| 欧美在线观看天堂一区二区三区| 久久五月天婷婷| 亚洲人永久免费| 欧美午夜大胆人体| 午夜精品av| 欧美成人精品一区二区三区| 亚洲精品日韩在线| 欧美视频在线观看免费网址| 亚洲欧美在线磁力| 免费亚洲电影在线| 亚洲图片激情小说| 国内精品久久久久影院薰衣草| 久久永久免费| 99日韩精品| 久久久亚洲成人| 亚洲每日更新| 国产精品亚洲第一区在线暖暖韩国| 欧美一区午夜精品| 亚洲久久一区二区| 久久久久久穴| 亚洲伦理自拍| 国产欧美精品一区二区色综合| 久久综合色88| 中文一区在线| 欧美大片免费| 亚洲一区不卡| 亚洲福利视频在线| 国产伦精品一区二区三区| 久久综合导航| 亚洲欧美成人| 亚洲日本一区二区| 美女日韩欧美| 欧美一区二区三区在线观看视频 | 日韩视频永久免费| 国产亚洲精品7777| 欧美日韩国产成人在线91| 久久久国产亚洲精品| 亚洲香蕉成视频在线观看 | 亚洲欧美日韩在线观看a三区 | 卡一卡二国产精品| 亚洲性夜色噜噜噜7777| 欧美大片一区| 久久精品一区| 性亚洲最疯狂xxxx高清| 夜夜嗨av一区二区三区| 亚洲缚视频在线观看| 国产麻豆综合| 国产精品自在在线| 国产精品国产三级国产aⅴ无密码| 久久婷婷国产综合精品青草|