2016-08-02 52 views
0
  1. 如果只有堆棧內存,沒有堆內存,將會創建哪些問題?我認爲它會讓節目非常快。
  2. 我知道對象是在堆內存中創建的。 但是如果在堆棧內存中創建對象,會有什麼問題?爲什麼我們創建了堆內存?

我讀過。1.爲什麼堆棧內存的大小是固定的?

堆棧

very fast access 
don't have to explicitly de-allocate variables 
space is managed efficiently by CPU, memory will not become fragmented 
limit on stack size (OS-dependent) 

variables can be accessed globally 
no limit on memory size 
(relatively) slower access 
no guaranteed efficient use of space, memory may become fragmented over time as blocks of memory are allocated, then freed 
you must manage memory (you're in charge of allocating and freeing variables) 
variables can be resized using realloc() 
+0

堆棧比堆更快訪問的想法充其量只是部分正確。確實,在堆棧上分配空間比分配堆內存要快,但是在內存訪問之後就是內存訪問。確實,接近當前堆棧頂端的東西更有可能處於緩存中,但如果您開始在堆棧中分配大量東西,那麼這種優勢也會消失。 –

回答

2

我將開始與堆棧堆/利與弊:

1.分配順序無關釋放:這是對你的問題最重要的答案。如果只有基於堆棧的內存,除非立即位於堆棧頂部,否則不能立即釋放內存區域。但是,使用堆時,無論分配請求的順序如何,都可以釋放內存。就像在一個動態軟件中一樣,你不能期望知道軟件整個生命週期中可用請求的順序,這就是爲什麼你不總是想要使用堆棧內存。

2.確定系統範圍的堆棧大小:另一個相關的問題是,如果只有堆棧內存被使用,這意味着系統中的所有線程都會有固定的內存。在這種情況下,確定理想的默認線程堆棧大小並不容易。這會導致內存過度消耗。因此,這可能會導致我們發生內存不足問題,即使實際上內存不足。關於這一點,我建議看看這個:http://linuxtips.manki.in/2011/11/tweaking-stack-size-of-linux-processes.html

堆棧狀堆分配器可以使用的領域:遊戲引擎採用這種技術。一個很好的例子是在加載和卸載資源時加載和卸載資源(紋理,着色器,三維網格等) 。像分配器這樣的堆棧是一個自然的解決方案,因爲卸載資產的順序與加載資產的順序相反。在這裏你可以看到一個實現:https://github.com/davidaug/stackallocator

與堆的其他問題:你也可以考慮這些更利弊堆棧作爲除了你的問題中提到的優點:

一)多核系統:關於堆棧分配器的另一個優點是鎖定爭用會少得多,因爲來自不同CPU核心的分配請求是解決堆分配器設計的重要問題。作爲鎖定爭用的補充,您還必須處理諸如虛假共享等問題。關於這一點,你可以看看http://www.drdobbs.com/parallel/understanding-and-avoiding-memory-issues/212400410

b)碎片:我提到的第一個項目(分配順序獨立釋放)是必須的要求。但是,這也帶來了碎片化的問題:What is memory fragmentation?

相關問題