當前位置:成語大全網 - 書法字典 - objective-c堆和棧的區別

objective-c堆和棧的區別

管理模式:對於棧,由編譯器自動管理,不需要我們手動控制;對於堆來說,釋放工作由程序員控制,容易產生內存泄漏。

應用程序大小:

堆棧:

在Windows下,堆棧是壹種擴展到低位地址的數據結構,是壹個連續的內存區域。堆棧頂部的地址和堆棧的最大容量由系統預先確定。

在WINDOWS下,棧的大小是2M(有人說是1M,是編譯時確定的常數)。如果應用的空間超過堆棧的剩余空間,將會提示溢出。因為

因此,堆棧中的可用空間更小。

Heap: Heap是壹種擴展到高位地址的數據結構,是壹個不連續的內存區域。這是因為系統使用鏈表存儲空閑內存地址,這種內存地址自然是不連續的,鏈表的遍歷方向是從低位地址到高位地址。堆的大小受計算機系統中可用的虛擬內存的限制。可見堆獲得的空間更靈活,更大。

碎片問題:對於堆來說,頻繁的新建/刪除必然會導致內存空間的不連續,從而造成大量的碎片,降低程序的效率。而對於棧來說,就不會有這樣的問題,因為棧是壹個先入後出的隊列,它們是那麽的壹壹對應,永遠不可能有壹個內存塊從棧中間彈出來。

分配方式:堆都是動態分配的,沒有靜態分配的堆。棧的分配有兩種方式:靜態分配和動態分配。靜態分配是由編譯器完成的,比如局部變量的分配。動態分配是由alloca函數分配的,但是棧的動態分配和堆的不同,它的動態分配是由編譯器釋放的,不需要人工實現。

分配效率:棧是機器系統提供的數據結構,計算機會在底層為棧提供支持:分配專用寄存器存儲棧的地址,推拉棧時執行特殊指令,決定了棧的高效率。堆是C/C++函數庫提供的,其機制非常復雜。