在文章的開頭,我要感謝部落格園的各位看官對小弟的上一篇文章的支援。
就像有網友說的一樣,這本書的前三章確實比較難懂,需要用心和反覆的去讀並揣摩(當然,不要去癡迷)在進行下一章內容前(由於筆者水平有限,還沒有完全理解,故本章不會進行講述),我想先說個基本概念,什麼是堆棧?(有點新瓶裝老酒的感覺,但是理解堆棧真的很重要)
首先,我們要非常的清楚堆和棧是兩個不同的概念(儘管我們經常把堆棧一起說)在C#中,我們把參考型別放在堆中,把實值型別放在棧中(如果對實值型別和參考型別不是很明白,請百度或者google,筆者就不在這裡做解釋了,望海涵)堆和棧的區別在於,堆是由系統自動分配的,而且系統不去釋放,需要我們自己手動釋放,雖然現在在C#中有記憶體回收機制,但是在我們手動調用GC.Collect()方法之後,我們需要知道需要馬上做強制回收的參考型別的代是多少,筆者覺得還不如在一個表單關閉之後進行Dispose()一下來的實在,如果在一個大系統中,經常出現記憶體溢出的異常而導致系統崩潰,各位看官就需要注意是否釋放了消耗的記憶體(雖然說有的看官覺得直接賦值為null也可以,但是筆者在工作中遇到過問題,就是說在把項目編譯成debug的時候賦值為null記憶體確實降低了,但是發布出去的項目編譯成Release模式效果不大,真的不知道是因為什麼,如果有人知道的話一定要告訴我,筆者將非常感激)。然而棧上分配的記憶體,系統會自動釋放並且它是由系統靜態分配的。在棧運行時,我們稱之為堆棧。
那麼堆棧的結構特點是什麼呢?給大家打個比方吧,我們可以把堆棧比喻成我們在做化學實驗的一個試管,而我們的那些資料比喻成有編號的玻璃球,從1、2……10進行編號,接著,我們把玻璃球從1號開始按順序放入試管內,那我們如何取出編號為1的球呢?沒錯,要從第10個開始取,取到編號為1的球為止。這就是堆棧的先進後出的一個結構特點。
在實際的工作中,堆棧依舊是先進後出。堆棧會在記憶體中開闢一個儲存地區,而我們需要的資料有序的一個一個的壓入到儲存地區中,在資料有序的進入到儲存地區的同時,會有一個地址指標,而這個地址指標總是指向最後一個進入儲存地區的資料。每一個進入儲存地區的資料,我們可以稱之為單元,在第一個資料單元被壓入儲存空間之後後一個資料單元在前一個資料單元相連的後面一個空間中進行儲存,以此類推。而地址之後自動指向剛進入儲存地區的資料單元,同樣,當最後一個資料單元被取出後,地址指標向前移一位。
以上為筆者對堆棧的理解,可能理解的不是很透徹,還望給位高手能給與糾正,對筆者也是一個提高。