深層理解-棧平衡原理-底層是如何實現棧平衡的? 在iOS、android操作系統中,經常會遇到入棧出棧的操作。 那麼現在操作系統已經不需要我們去關心堆棧的操作。 比如:iOS中的ARC模式,android中的JVM都會幫我們自動釋放記憶體,自動保持堆棧平衡。但是對於開發者來說,還是很有必要掌握堆棧平衡 ...
深層理解-棧平衡原理-底層是如何實現棧平衡的?
在iOS、android操作系統中,經常會遇到入棧出棧的操作。 那麼現在操作系統已經不需要我們去關心堆棧的操作。
比如:iOS中的ARC模式,android中的JVM都會幫我們自動釋放記憶體,自動保持堆棧平衡。但是對於開發者來說,還是很有必要掌握堆棧平衡原理的。
那麼今天讓我們來詳細討論下iOS的棧平衡。
首先,我們要明白什麼情況下的代碼,會進行出棧入棧的操作。
以Objective-C語法為例:
重點:
一個非常簡單的加法運算,聲明瞭幾個局部變數。而局部變數a、b、c,在棧空間可用的情況下,通常存在棧空間。只要這個函數執行完畢,a、b、c這三個變數就會出棧,即記憶體銷毀。
我們所做的iOS程式用的都是高級語言,那麼想運行在手機或者電腦上就要經過編譯鏈接。
如:高級語言->彙編語言->機器語言
既然高級語言要編譯成彙編語言,那麼我們利用8086彙編,看底層是如何實現棧平衡的。
彙編代碼:
上面的代碼是“沒有進行棧空間釋放”的,即只入棧不出棧。
看看執行效果如何:
1.1 棧針在0710:0014
1.2 這表示未出棧,程式不結束的情況下,會一直占用棧空間。
我們修改下彙編代碼,看看正常的入棧出棧:
看下運行效果
2.1 釋放棧空間之前
2.2 釋放之後,棧針回到原來的狀態,正常入棧出棧
總結:有入必有出,才能保證棧空間的正常。
上面就是入棧出棧,關於棧平衡的原理了。轉載請註明出自於數字先生。