1. 程式人生 > >什麼是堆和棧?它們在哪?

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

原文

What and where are the stack and heap?

譯文

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

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

答(7K 多贊)

棧是作為執行執行緒的臨時空間留出的記憶體。呼叫函式時,在棧頂部保留一個塊,用於本地變數和一些臨時資料。當該函式返回時,該塊將變為未使用狀態,並可在下次呼叫函式時使用。堆疊始終以 LIFO (後進先出)順序保留;最近保留的塊始終是要釋放的下一個塊。這使得跟蹤棧非常簡單;從棧中釋放塊只不過是調整一個指標。

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

每個執行緒都有一個棧,而應用程式通常只有一個堆(儘管為不同型別的分配設定多個堆並不罕見)。

直接回答您的問題:

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

作業系統在建立執行緒時為每個系統級執行緒分配堆疊。 通常,語言執行庫呼叫OS來為應用程式分配堆。

  • 它們的範圍是什麼?

堆疊附加到一個執行緒,因此當執行緒退出堆疊時將被回收。 堆通常在應用程式啟動時由執行時分配,並在應用程式(技術過程)退出時回收。

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

建立執行緒時設定堆疊的大小。 堆的大小在應用程式啟動時設定,但可以在需要空間時增長(分配器從作業系統請求更多記憶體)。

  • 哪一個更快?

棧更快,因為訪問模式使得從中分配和釋放記憶體變得微不足道(指標/整數簡單地遞增或遞減),而堆在分配或釋放中涉及更復雜的臨時資料儲存。 此外,棧中的每個位元組都經常被頻繁地重用,這意味著它往往被對映到處理器的快取,使其非常快。 堆的另一個性能損失是堆(主要是全域性資源)通常必須是多執行緒安全的,即每個分配和釋放都需要需要與程式中的“所有”其他堆訪問代表性地同步。