可能重複:
C++ Which is faster: Stack allocation or Heap allocation什麼是更高效的堆棧內存或堆?
什麼是內存分配的角度更有效 - 棧內存或堆內存?它取決於什麼?
很顯然,動態分配的開銷與堆棧上的分配有關。使用堆涉及找到可以分配內存的位置並維護結構。在堆棧中,它很簡單,因爲您已經知道放置元素的位置。我想了解在允許動態分配的支持結構的最壞情況下以毫秒爲單位的開銷是多少?
可能重複:
C++ Which is faster: Stack allocation or Heap allocation什麼是更高效的堆棧內存或堆?
什麼是內存分配的角度更有效 - 棧內存或堆內存?它取決於什麼?
很顯然,動態分配的開銷與堆棧上的分配有關。使用堆涉及找到可以分配內存的位置並維護結構。在堆棧中,它很簡單,因爲您已經知道放置元素的位置。我想了解在允許動態分配的支持結構的最壞情況下以毫秒爲單位的開銷是多少?
堆棧通常速度更高效,實現起來很簡單!
我傾向於從喬爾與邁克爾同意在軟件網站,誰說,
更有效地使用堆棧 當它是可能的。
當你從堆中分配的 堆管理器要經過什麼 有時一個相對複雜的過程 ,找到 內存空閒塊。有時它必須在 附近找到合適大小的 。
這通常不是一個可怕的數額 的開銷,但它肯定比 如何運作的功能更復雜的工作 。當你使用棧內存儲器時,編譯器能夠立即從棧中索取一塊內存塊 以供使用。它基本上是一個更簡單的程序。
然而,堆棧的大小是 有限的,所以你不應該使用它的 非常大的事情,如果你需要的東西 是大於 像4K左右,那麼你應該 總是搶取而代之的是從堆 。
使用堆棧的另一個好處是 它自動清理 當電流函數退出,你 不必擔心自己清洗它 。你必須小心謹慎地使用堆分配,以確保 確信它們已被清理。使用 智能指針,處理 自動刪除堆 分配可以幫助很多與此。
我有點討厭它,當我看到代碼, 做的東西像分配2個整數 離堆,因爲程序員 需要一個指針,2個整數和 當他們看到一個指針,他們只是 自然而然地認爲他們需要到 使用堆。我傾向於看到 經驗豐富的編碼器有點 - 這是 應該使用堆棧並且只有 在 堆棧上聲明的2個整數的數組類型。
在喬爾從一個很好的討論,掛牌公告的軟件網站:
在堆棧上分配/釋放更「高效」,因爲它只涉及遞增/遞減堆棧指針,通常堆分配通常要複雜得多。也就是說,在堆棧中放置大量內容通常不是一個好主意,因爲堆棧空間遠比大多數系統上的堆空間有限(特別是當涉及多個線程時,因爲每個線程都有單獨的堆棧)。
堆棧效率更高,但大小有限。我認爲它就像1MByte。
當在堆上分配內存時,請記住數字1000.在堆上分配比在堆上慢1000倍。
的內存這兩個地區是不同的使用情況進行了優化。
該堆棧針對以FIFO順序釋放對象的情況進行了優化 - 也就是說,較新的對象始終在舊對象之前分配。因此,只需維護一大堆字節,然後在最後交付或收回字節,就可以快速分配和解除分配內存。因爲存儲函數調用的局部變量所需的內存總是以這種方式回收(因爲函數總是以與調用它們相反的順序完成執行),所以堆棧是分配這種內存的好地方。
但是,堆棧並不擅長進行其他類型的分配。您不能輕鬆地釋放分配給不是最近分配塊的堆棧的內存,因爲這會導致堆棧中存在「間隙」,並使確定字節可用位置的邏輯複雜化。對於這種類型的分配,對象的生命週期不能根據分配對象的時間來確定,堆是存儲事物的好地方。實現這個堆的方法有很多,但其中大多數依賴於存儲巨大表或鏈接列表的方式,這些方法的分配方式可以輕鬆地找到合適的內存塊,以便將其交給客戶端。當內存被釋放時,它會被重新添加到表或鏈接列表中,並且可能會應用其他邏輯來將這些塊與其他塊進行壓縮。由於搜索時間的這種開銷,堆通常比堆棧慢得多。然而,堆可以在堆棧通常並不擅長的模式中進行分配,因此這兩者通常都存在於程序中。
有趣的是,還有一些其他分配內存的方式落在兩者之間。一種常見的分配技術使用稱爲「競技場」的東西,其中從堆中分配單個大塊內存,然後將其分割成更小的塊,如在堆棧中。如果分配是連續的(例如,如果要分配大量小物件,這些小物件都生活在相同長度中),但是這些對象可以超越任何特定的函數調用。存在許多其他方法,這只是可能的一小部分,但它應該清楚地表明內存分配完全是關於權衡。你只需要找到一個適合你特定需求的分配器。
爲什麼高效? – Anycorn 2011-02-11 22:17:35
這取決於..... – 2011-02-11 22:17:47
投票結束爲NARQ。 – 2011-02-11 22:20:34