堆和棧, 他們是什么?

堆和棧, 他們是什么?

文章地址

    1. 堆包含一個鏈表 來維護已用和空閑的內存塊. 在堆上新分配內存是從空閑的內存塊中找到一些滿足要求的合適塊. 這個操作會更新堆中的塊鏈表. 這些元信息也存儲在堆上, 經常在每個塊的頭部一個很小區(qū)域.
    1. 堆增加新塊, 通常從低地址向高地址擴展. 因此你可以認為堆隨著內存分配而不斷的增加大小. 如果申請的內存很小的話, 通常從底層操作系統(tǒng)中得到比申請的要多的內存
    1. 申請和釋放許多小的塊, 可能會產生如下狀態(tài): 在已用塊之間存在很多小的空閑塊. 進而申請大塊內存時失敗, 雖然空閑塊的總和足夠, 但是空閑的小塊是零散的, 不能滿足申請的大小; 這叫做"堆碎片";
  • 4.當旁邊有空閑塊的已用塊被釋放時, 新的空閑塊可能會與相鄰的空閑塊合并為一個大的空閑塊, 這樣可以有效的減少堆碎片的產生.

    1. 棧經常與 stack pointer寄存器一起工作, 最初 sp 指向棧頂.
    1. CPU 用 push 指令來將數(shù)據壓棧[sp值減小,向低地址擴展], 用pop 指令彈棧[sp值增大].
    1. 當函數(shù)被調用時崇决,CPU使用特定的指令把當前的 IP (譯者注:“instruction pointer”,是一個寄存器,用來記錄 CPU 指令的位置)壓棧蕴坪。即執(zhí)行代碼的地址。CPU 接下來將調用函數(shù)地址賦給 IP ,進行調用肋乍。當函數(shù)返回時,舊的 IP 被彈棧敷存,CPU 繼續(xù)去函數(shù)調用之前的代碼墓造。
  • 4.當進入函數(shù)時堪伍,sp 向下擴展,擴展到確保為函數(shù)的局部變量留足夠大小的空間觅闽。如果函數(shù)中有一個 32-bit 的局部變量會在棧中留夠四字節(jié)的空間帝雇。當函數(shù)返回時,sp 通過返回原來的位置來釋放空間蛉拙。
  • 5.如果函數(shù)有參數(shù)的話尸闸,在函數(shù)調用之前,會將參數(shù)壓棧孕锄。函數(shù)中的代碼通過 sp 的當前位置來定位參數(shù)并訪問它們吮廉。
  • 6.函數(shù)嵌套調用和使用魔法一樣,每一次新調用的函數(shù)都會分配函數(shù)參數(shù)畸肆,返回值地址宦芦、局部變量空間、嵌套調用的活動記錄都要被壓入棧中轴脐。函數(shù)返回時调卑,按照正確方式的撤銷。
  • 7.棧要受到內存塊的限制大咱,不斷的函數(shù)嵌套/為局部變量分配太多的空間恬涧,可能會導致棧溢出。當棧中的內存區(qū)域都已經被使用完之后繼續(xù)向下寫(低地址)徽级,會觸發(fā)一個 CPU 異常气破。這個異常接下會通過語言的運行時轉成各種類型的棧溢出異常聊浅。(譯者注:“不同語言的異常提示不同餐抢,因此通過語言運行時來轉換”我想他表達的是這個含義)

1.在通常情況下由操作系統(tǒng)(OS)和語言的運行時(runtime)控制嗎?

  • 棧: 棧通常是 后進先出 的方式預留空間. 這么做可以使得跟蹤堆棧, 變得簡單; 從棧中釋放塊只不過是指針的偏移而已.
  • 堆: 從堆上分配沒有固定的模式; 你可以在任何時候分配它和釋放它. 這就使得跟蹤哪部分堆已經被分配和被釋放變的異常復雜;

每一個線程都有一個棧, 但是每個應用程序通常都只有一個堆.

答:

    1. 當線程創(chuàng)建的時候, 操作系統(tǒng)為每一個系統(tǒng)級的線程分配, 通常情況下, 操作系統(tǒng)通過調用語言的運行時去為應用程序分配堆.
    1. 棧附屬于線程, 當線程結束時棧被回收. 堆通常通過運行時在應用程序啟動時被分配, 當應用程序(進程)退出時被回收.
    1. 線程被創(chuàng)建的時候, 設置的大小. 在應用程序啟動的時候, 設置的大小, 但是可以再需要的時候擴展.
  • 4.棧比堆要快; 因為棧存取模式使它可以輕松的分配和重新分配內存(指針只是進行簡單的遞增或遞減運算). 而對在分配和釋放的時候有更多的復雜的操作. 另外棧上的每個字節(jié)頻繁的被復用也就意味著它可能映射到處理器緩存中,使用很快(局部性原理)

2. 哪個更快低匙?

你問題的答案是依賴于實現(xiàn)的旷痕,根據不同的編譯器和處理器架構而不同。下面簡單的解釋一下:

  1. 棧和堆都是用來從底層操作系統(tǒng)中獲取內存的顽冶。
  2. 在多線程環(huán)境下每一個線程都可以有他自己完全的獨立的棧欺抗,但是他們共享堆。并行存取被堆控制而不是棧强重。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末绞呈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子间景,更是在濱河造成了極大的恐慌佃声,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倘要,死亡現(xiàn)場離奇詭異圾亏,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門志鹃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夭问,“玉大人,你說我怎么就攤上這事曹铃$智鳎” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵铛只,是天一觀的道長埠胖。 經常有香客問我,道長淳玩,這世上最難降的妖魔是什么直撤? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蜕着,結果婚禮上谋竖,老公的妹妹穿的比我還像新娘。我一直安慰自己承匣,他們只是感情好蓖乘,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著韧骗,像睡著了一般嘉抒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袍暴,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天些侍,我揣著相機與錄音,去河邊找鬼政模。 笑死岗宣,一個胖子當著我的面吹牛,可吹牛的內容都是我干的淋样。 我是一名探鬼主播耗式,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼趁猴!你這毒婦竟也來了刊咳?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤儡司,失蹤者是張志新(化名)和其女友劉穎娱挨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枫慷,經...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡让蕾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年浪规,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片探孝。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡笋婿,死狀恐怖,靈堂內的尸體忽然破棺而出顿颅,到底是詐尸還是另有隱情缸濒,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布粱腻,位于F島的核電站庇配,受9級特大地震影響,放射性物質發(fā)生泄漏绍些。R本人自食惡果不足惜捞慌,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柬批。 院中可真熱鬧啸澡,春花似錦、人聲如沸氮帐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽上沐。三九已至皮服,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間参咙,已是汗流浹背龄广。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昂勒,地道東北人蜀细。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓舟铜,卻偏偏與公主長得像戈盈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谆刨,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內容

  • 摘自http://blog.jobbole.com/75321/ 問題描述 編程語言書籍中經常解釋值類型被創(chuàng)建在棧...
    許小小晴閱讀 559評論 0 0
  • 問題描述 ??編程語言書籍中經常解釋值類型被創(chuàng)建在棧上,引用類型被創(chuàng)建在堆上她我,但是并沒有本質上解釋這堆和棧是什么虹曙。...
    YangPu閱讀 961評論 0 5
  • 原文:http://stackoverflow.com/questions/79923/what-and-wher...
    toplee閱讀 884評論 0 1
  • 問題描述 編程語言書籍中經常解釋值類型被創(chuàng)建在棧上迫横,引用類型被創(chuàng)建在堆上,但是并沒有本質上解釋這堆和棧是什么酝碳。我僅...
    大爺進城務工閱讀 303評論 1 3
  • 寒冷的北方矾踱,常年冰雪覆蓋,一個來自南方的旅人在雪地中邂逅了一朵美麗的花疏哗。潔白如雪呛讲,卻充滿生命力。常人眼里很難在白白...
    謝棕火火火火閱讀 312評論 0 1