走進C語言:堆、棧與堆區、棧區,你知道有什麼區別嗎?

2020-12-19 騰訊網

一、區別

註:首先堆和棧可以分為兩種,一種是數據結構,另一種是和內存的分配有關,這兩種雖然都有棧和堆,但是兩者關係並不大,

1、棧、堆是數據結構裡面的叫法,注意:有時候有人喜歡這樣說 「堆棧」 其實說的就是棧而不是堆。

2、棧區、堆區 則是內存模型的叫法。

二、內存中的棧區和堆區

我們知道php的底層是C (任何語言其實都可以分為大同小異的幾塊)

而C語言的內存模型分為5個區:棧區、堆區、靜態區、常量區、代碼區。每個區存儲的內容如下:

1、棧區:存放函數的參數值、局部變量等,由編譯器自動分配和釋放,通常在函數執行完後就釋放了,其操作方式類似於數據結構中的棧。棧內存分配運算內置於CPU的指令集,效率很高,但是分配的內存量有限,比如iOS中棧區的大小是2M。

2、堆區:就是通過new、malloc、realloc分配的內存塊,編譯器不會負責它們的釋放工作,需要用程序區釋放。分配方式類似於數據結構中的鍊表。「內存洩漏」通常說的就是堆區。

3、靜態區:全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束後,由系統釋放。

4、常量區:常量存儲在這裡,不允許修改。

5、代碼區:顧名思義,存放代碼。

分布圖:

棧區和堆區大小差異?

棧區:由圖中其實可以知道,棧區是向低地址擴展的,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,大小在進程分配時是確定的,具體大小看編譯器,作業系統。所需大小一般小於10M!太大沒有意義,不符合棧是用來快速存取的目標。

堆區:堆區是向高地址擴展的,是不連續的內存區域(這是由於系統是用鍊表來存儲的空閒內存地址的,自然是不連續的是動態分配的),因為會手動進行分配,會大一些,大小不固定。

棧區和堆區效率差異?

棧區:由系統自動分配,速度較快。但程式設計師是無法控制的。(只要棧的剩餘空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。)

堆區:是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便。(首先應該知道作業系統有一個記錄空閒內存地址的鍊表,當系統收到程序的申請時,會遍歷該鍊表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的 delete語句才能正確的釋放本內存空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒鍊表中)

小結:其實從上面的知識我們可以看出,如果存放在堆中的數據如果不進行釋放,很可能造成內存洩漏,因為並不一定能觸發gc機制回收。所以對於堆中的內存使用,我們要記得用完釋放。

三、數據結構中的棧和堆

什麼是數據結構?

存儲與組織數據的方式。我感覺更應強調數據的組織方式,比如好多數據結構的存儲方式都是用的數組,但他們根據自身的特點進行了封裝,因為存儲方式只有順序存儲和鏈式存儲兩種,但是卻可以組合成多種數據結構。

常用的數據結構有哪些?

數組、棧、堆、隊列、鍊表等等。

棧是限定僅僅在表尾進行插入和刪除操作的線性表,把允許插入和刪除的一端稱之為棧頂,另外一端稱之為棧底。特點:後進先出,稱之為後進先出線性表。

棧的應用:遞歸。

是一種經過排序的樹形數據結構,每一個節點都有一個值,通常所說堆的數據結構是二叉樹,堆的存取是隨意的。所以堆在數據結構中通常可以被看做是一棵樹的數組對象。而且堆需要滿足一下兩個性質:

(1)堆中某個節點的值總是不大於或不小於其父節點的值;

(2)堆總是一棵完全二叉樹。

堆的應用:堆排序,快速找出最大值、最小值,簡化時間複雜度,像這樣支持插入元素和尋找最大(小)值元素的數據結構稱之為優先隊列。

相關焦點

  • jvm之棧、堆
    就在此時,c老頭和c++老頭緩步走來,看著被眾人圍住的java,c老頭感嘆地對著身旁的c++說道:「原以為你就可以挑起我的梁子一直走下去的。」 c++笑著回應道:「江山代有才人出,這世界以後總會是90後甚至00後的天下!」察覺到c和c++的java連忙走出人群,說道:「兩位前輩謙虛了,這世界可還離不開兩位前輩,我只不過是站在了兩位前輩的肩上罷了。」
  • 「GC系列」JVM堆內存分代模型及常見的垃圾回收器
    一個對象的生命歷程-從出生到消亡一個對象被new出來之後,首先嘗試進行棧上分配,棧上如果分配不下才會進入eden區;eden區經過一次垃圾回收之後進入一個survivor區-s1區;survivor區(s1)經過一次垃圾回收之後又進入另一個survivor區-s2區,同時eden區的某些對象也會跟著進入
  • 可視化動圖帶你一步步講解棧有什麼用
    可視化動圖帶你一步步講解棧有什麼用 棧(stack)是限定僅在表尾(即棧頂)進行插入和刪除操作的線性表。對於棧來說,出棧只能將棧頂元素刪除。因此,執行一次出棧動作,就會刪除掉棧頂元素20。
  • 三星堆祭祀區正式啟動發掘
    祭祀區發掘現場。有機實驗室、無機實驗室、應急分析實驗室、文保工作室、考古工作室、微痕應急保護實驗室……將為未來的出土文物保駕護航●為了控制恆溫恆溼,水冷中央空調和高壓微霧加溼系統即將登場,最大程度呵護出土文物9月6日,三星堆遺址祭祀區,昔日開放式的遺址公園已經被一座精緻的鋼構大棚覆蓋。34年前,這裡發現的三星堆一、二號祭祀坑,讓古蜀文明一醒驚天下。
  • 周歲Party(小九心情驛棧)
    ,卻分明是異鄉寓所的時候,才知道,家還很遠、很遠,況且,眼眶瞬時便溼潤了……想想,能在驛棧喝喝茶,聽聽誦讀,也還不錯。不需要多說什麼,胞澤圍座,燈火可親。時光有時是有情的……,喜歡用聲音記錄和分享生活的點點滴滴,在她的心情驛棧裡你總能從她精心選取的作品中獲得共鳴和感悟,在這個紛繁複雜的世界裡,人們每天都在忙碌地打拼,但小九給大家提供了讓你的靈魂放鬆和休憩的場所,娓娓道來的好聲音總能帶給你片刻的寧靜和思考,在這裡我們接觸到了不同詩歌創作者的作品,有好多還是熟悉的朋友,特別得親切,每次的寄語也讓我們對作者有了更多的了解,我沒有在小九驛棧剛剛成立時與她相識,但是唯願不缺席她以後的成長
  • 紹興山區的茶棧
    所謂「茶棧」,它們都是由一些中、小資本家集資創建的小型的、季節性的制茶廠。 工藝落後,設備簡陋,勞動強度大。但這些茶棧從它的經濟性質上分,則可分為「洋莊茶棧」和「土莊茶棧」兩種。 王壇的一家洋莊茶棧棧主陶星橋,他從他所製作的第一批茶葉開始,就以「星橋」作商標,他所製作的款葉有圓茶、條茶兩類,而圓茶(又稱珠茶)又可分為丁、正、蠶、中、呵、副、禾、麻、頭圓、二圓、三圓十一種;條茶(又稱眉茶)可分為珍眉、針眉、秀眉、迎春四種,共計有十五種品種。 尤其是珠茶(又稱頂珠)顆顆珠圓泡滿,一經開水衝泡,形如槍尖。
  • SCHOOL十周年合輯之堆填區 | 錄音故事
    本次,《Q》和這張專輯中唯一一支南方樂隊堆填區,以及特邀專輯製作人王迪一起,聊聊他們在錄音室發生的故事。 在堆填區演繹垃圾搖滾 在等待樂器錄製的間隙,堆填區樂隊的四位大男孩站在棚門口抽菸,用廣東話開著三三兩兩的玩笑,方言構建出了一片南方的地域空間,其他人都被語言隔絕。
  • 【發現長春●悅來客棧】一百年前的「連鎖酒店」—悅來棧
    清朝末年,華北地區乾旱、洪澇接踵而至,為了活命,大批山東、河北、山西等地的流民,闖關越邊,經遼西走廊來到東北腹地,其中就有祖憲庭的身影。 當年,闖關東的流民大多修建不起房屋,沒有固定住所。祖憲庭看準其中的商機,在二道溝一帶修建地窨子,作為闖關東流民的臨時住處,這也成為祖憲庭在長春最早開辦的 「旅館」。
  • 省級文保單位生順茶棧完成修復 將開闢為紅色教育基地
    28日,記者隨負責指導該文保點修復的國家文物局古建築專家庫成員、古建築專家陳木霖實地探訪生順茶棧,探秘生順茶棧修復及其背後的紅色故事。文保點修復用上「釘子」生順茶棧位於下杭路238號,始建於清代,坐北朝南,共有三進,佔地面積2000多平方米。
  • 七牛雲姬長軍:企業技術棧向雲原生轉型的實踐與思考
    事實也確實如此,雲原生涉及的技術棧較多,研發人員需要一定的時間去了解和實踐,因此在做技術棧升級時,技術領導者需要充分考慮到這一點。如何優雅地應對雲原生技術挑戰?Prow 有很多優點,比如它輕量,基本是無狀態的,基於 CRD 實現。且 Prow 採用 Yaml 作為配置語言,基於 PR 的 CI 環境用完即銷毀,擁有很好的隔離性,場景需求完美契合,其豐富的 GitOps/ChatOps plugin,方便二次開發。姬長軍講解道:「有看到一些企業在考慮雲原生時,會將重點放在封裝 Kubernetes 的複雜性,企圖通過一套 UI 去降低用戶上容器的負擔。
  • 基於和欣嵌入式作業系統實現的一個構件化的網絡協議棧設計淺析
    要實現嵌入式設備的網絡化,需要實現TCP/IP網絡協議棧,但由於Internet上各種通信協議對計算機存儲器、運算速度等的要求比較高,使得嵌入式系統協議棧的開發實現並不順利。 目前有兩個關鍵因素影響網絡協議棧的開發,一是性能和效率,二是開發調試方便。傳統的作業系統一般只能顧及其中的一個方面。
  • 婦聯喊你享民宿③丨【隱峰麓棧】十九峰旁如詩美景,尋覓畫布上的...
    婦聯喊你享民宿③丨【隱峰麓棧】十九峰旁如詩美景,尋覓畫布上的詩意棲居 2020-03-31 21:30 來源:澎湃新聞·澎湃號·政務
  • 美棧專訪 | 上海金茂君悅大酒店總經理及區域副總裁夏浩強先生
    上海金茂君悅大酒店位於88層金茂大廈的53-87層,地處浦東高速發展的商業金融區陸家嘴的中心。548間豪華客房裝修極具特色,現代藝術中融入了中國傳統文化,均可欣賞申城美景。美棧:首先請您簡單介紹酒店的基本概況。我們酒店的市場定位是什麼?酒店最大的特色在哪裡?
  • 寶安原創音樂劇《7號藝棧》首亮相
    音樂劇《7號藝棧》演出劇照。 寶安日報訊(記者 趙盼盼 通訊員 鄧裕達 文/圖)由寶安區文化廣電旅遊體育局與深圳市藝彩天成文化傳播有限公司聯袂打造的寶安原創音樂劇《7號藝棧》,近日在宗泰文創產業園亮相。
  • 東莞市瓦藍棧公益基金會曬帳本,去年公益事業支出大於收入!
    根據瓦藍棧公益基金會曬出的帳本,去年,其捐贈收入共達2453379.26元。東莞市瓦藍棧公益基金會負責人孫岐坤表示,捐贈收入共來自幾個方面,其中的「大頭」是慕思·南都愛心基金的捐贈,共有170萬元,佔了所有收入的近7成。 「慕思·南都愛心基金相當於瓦藍棧公益基金會裡的一個專項基金。
  • 打造新中式精品酒店 | 訪北京皇家驛棧董事長劉少軍
    董事長劉少軍藝術家的思維,企業家的謀略位於前門的老式街巷之間有了一處靜謐而典雅的中式酒店,「皇家驛站」。看到兩個朋友都造訪過這個地方,我也在這個春光明媚的日子來到這家充滿中國風的小而精緻的酒店。酒店分東西兩側,中間有個高大的天井,就在這裡他們特別設計了雨巷,每早9點,雨簾自天而降,如戴望舒的詩歌《雨巷》裡的情景。