棧的增減只需要移動(dòng)棧頂寄存器。堆需要便歷鏈表,找到空的區(qū)間,可能還要處理內(nèi)存碎片。
棧是本著LIFO原則的存儲(chǔ)機(jī)制,尋址間距短,對(duì)棧數(shù)據(jù)的定位相對(duì)比較快速, 而堆則是隨機(jī)分配的空間,處理的數(shù)據(jù)比較多,無(wú)論如何,至少要兩次定位。
其次, 棧是由CPU提供指令支持的, 在指令的處理速度上, 對(duì)棧數(shù)據(jù)進(jìn)行處理的速度自然要優(yōu)于由操作系統(tǒng)支持的堆數(shù)據(jù)。
再者, 棧是在一級(jí)緩存中做緩存的, 而堆則是在二級(jí)緩存中, 兩者在硬件性能上差異巨大。棧很大機(jī)會(huì)會(huì)被虛擬機(jī)分配至物理機(jī)器的高速寄存器中存儲(chǔ)。
語(yǔ)言對(duì)棧的優(yōu)化支持要優(yōu)于對(duì)堆的支持。
堆分配的空間在邏輯地址上是連續(xù)的,但在物理地址上是不連續(xù)的。相鄰的兩個(gè)字節(jié)可能是在不同的物理分頁(yè)上;