什麼是堆和棧?它們在哪?

原文

What and where are the stack and heap?

譯文

編程語言書籍解釋了在堆棧上創建了值類型,並且在堆上創建了引用類型,而沒有解釋這兩者是什麼。 我還沒有看到對此的明確解釋。 我理解堆棧是什麼。 但,

  • 它們在哪裏(物理上在真實計算機內存中)?
  • 它們在多大程度上受操作系統或語言運行時控制?
  • 它們的範圍是什麼?
  • 是什麼決定了它們的大小?
  • 哪一個更快?

答(7K 多贊)

棧是作爲執行線程的臨時空間留出的內存。調用函數時,在棧頂部保留一個塊,用於本地變量和一些臨時數據。當該函數返回時,該塊將變爲未使用狀態,並可在下次調用函數時使用。堆棧始終以 LIFO (後進先出)順序保留;最近保留的塊始終是要釋放的下一個塊。這使得跟蹤棧非常簡單;從棧中釋放塊只不過是調整一個指針。

堆是爲動態分配留出的內存。與棧不同,堆中的塊的分配和釋放沒有強制模式;您可以隨時分配一個塊並隨時釋放它。這使得在任何給定時間跟蹤堆的哪些部分被分配或釋放變得更加複雜;有許多自定義堆分配器可用於調整不同使用模式的堆性能。

每個線程都有一個棧,而應用程序通常只有一個堆(儘管爲不同類型的分配設置多個堆並不罕見)。

直接回答您的問題:

  • 它們在多大程度上受操作系統或語言運行時控制?

操作系統在創建線程時爲每個系統級線程分配堆棧。 通常,語言運行庫調用OS來爲應用程序分配堆。

  • 它們的範圍是什麼?

堆棧附加到一個線程,因此當線程退出堆棧時將被回收。 堆通常在應用程序啓動時由運行時分配,並在應用程序(技術過程)退出時回收。

  • 是什麼決定了它們的大小?

創建線程時設置堆棧的大小。 堆的大小在應用程序啓動時設置,但可以在需要空間時增長(分配器從操作系統請求更多內存)。

  • 哪一個更快?

棧更快,因爲訪問模式使得從中分配和釋放內存變得微不足道(指針/整數簡單地遞增或遞減),而堆在分配或釋放中涉及更復雜的臨時數據保存。 此外,棧中的每個字節都經常被頻繁地重用,這意味着它往往被映射到處理器的緩存,使其非常快。 堆的另一個性能損失是堆(主要是全局資源)通常必須是多線程安全的,即每個分配和釋放都需要需要與程序中的“所有”其他堆訪問代表性地同步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章