新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C語言編程中的“堆”和“?!逼叽蟛煌?/p>

        C語言編程中的“堆”和“?!逼叽蟛煌?/h1>
        作者: 時間:2019-01-07 來源:網絡 收藏

          對于編程初學者來說會接觸到一些難以理解的名稱,比如堆(heap)、棧(stack)、(stack)等。初學開發過程中往往讓人混淆不清。今天我們來談談堆和棧的具體區別,來幫助初學者理清思路。

        本文引用地址:http://www.104case.com/article/201901/396398.htm

          堆和棧的區別一直都是永恒的話題,為此我也查了很多的資料,以防自己的理解錯誤,而給他人造成理解偏差。

          先從簡單的一個例子引出堆和棧:

          void function(){

          int *p = (int *)malloc(10*sizeof(int));

          }

          這是開發學習過程中,必不可免要學習的知識,動態分配一塊空間,空間在堆區大小是40字節(32位系統中)。而定義的指針變量p是局部變量(在棧區中 占用4字節空間),用來存放剛剛前面動態分配的空間的首地址??梢钥闯?,在這一句代碼中同時包含了棧和堆,如圖1所示。

          圖1堆和棧

          我們從以下幾個方面比較一下堆和棧:

          (1)存儲內容不同

          棧:在函數調用時,棧中存放的是函數中(底下是函數調用后的下一條指令)各個參數(局部變量)。

          堆:一般是在堆的頭部用一個字節存放堆的大小。堆中的具體內容有程序員安排。

          (2)管理方式上不同

          棧:由系統自動分配空間,同時系統自動釋放空間。 例如,聲明在函數中一個局部變量 int b; 系統自動在棧中為b開辟空間,當對應的生存周期結束后棧空間自動釋放。

          堆:需要程序員手動申請并且手動釋放,并指明大小,在中malloc函數申請,釋放free函數,在C++中 new和delete實現。

          (3)空間大小不同

          棧:獲取空間較小。在Windows下,一般大小是1M或2M,當剩余棧空間不足時,分配失敗overflow。

          堆:獲得空間根據系統的有效虛擬內存有關,比較靈活,比較大。

          (4)能否產生碎片不同

          棧:不會產生碎片,空間連續。

          堆:采用的是鏈表的存儲方式,會產生碎片。

          (5)生長方向不同

          棧: 向低地址擴展的數據結構,是一塊連續的內存的區域。

          堆: 向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。

          (6)分配方式不同

          棧:有2種分配方式:靜態分配和動態分配,靜態由編譯器完成,例如局部變量;動態由alloca函數實現,并且編譯器會進行釋放。

          堆: 都是動態分配的,沒有靜態分配的堆。

          (7)分配效率不同

          棧:由系統自動分配,速度較快。但程序員是無法控制的。

          堆:由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來方便。

          以上是棧和堆幾個方面的不同,希望通過上面的資料可以幫助初學者分清堆和棧。



        關鍵詞: C語言 堆棧

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 工布江达县| 佛学| 武平县| 尼木县| 南丹县| 梧州市| 东辽县| 新津县| 鄂伦春自治旗| 茂名市| 新民市| 阜城县| 平和县| 莒南县| 浠水县| 屯昌县| 钟祥市| 双牌县| 永丰县| 伊春市| 肃宁县| 景泰县| 紫阳县| 资阳市| 南昌市| 西城区| 郴州市| 武清区| 崇阳县| 霍州市| 江华| 太康县| 新和县| 文成县| 大理市| 宽甸| 介休市| 佳木斯市| 嘉祥县| 若尔盖县| 当雄县|