1. 程式人生 > 其它 >delphi D11程式語言手冊 學習筆記(P393-419) 物件與記憶體

delphi D11程式語言手冊 學習筆記(P393-419) 物件與記憶體

 這本書可以在 Delphi研習社②群 256456744 的群檔案裡找到. 書名: Delphi 11 Alexandria Edition.pdf

 這些年來,Delphi 行動裝置編譯器提供了一個不同的記憶體模式,稱為自動參考計數(ARCAutomatic Reference Counting)。這個管理模式是由 Apple開始從 Objective-C 語言推廣的,ARC 讓編譯器支援物件參考在記憶體中被使用的次數,並在這個次數被設為 0 的時候(也就是該物件沒有在任何地方被使用到的時候),就把該物件自動釋放掉。這個作法跟 Delphi 在所有平臺上對介面參考所處理的作法很像。Delphi 10.4

開始,對 ARC 的支援已經從所有平臺全數取消了。

 全域性資料、堆疊以及 Heap
  在任何一個 Object Pascal 的應用程式裡面所使用的記憶體可以分成兩個領域:原始碼與資料.在一個程式的執行檔案裡面包含幾個部分,包含資源(例如圖片、窗體描述檔案),以及由程式載入到記憶體使用的函式庫。這些記憶體區塊是隻讀的(在幾個平臺上,例如 Windows),且可以讓多個處理程式共享.仔細研究資料部分也是很有趣的。Object Pascal 程式(像大多其他的程式語言的寫法一樣)的資料是分成三大塊來儲存的:全域性記憶體、堆疊、Heap

1.全域性記憶體

  也叫靜態記憶體,用來儲存生命週期從應用程式開始到結束為止的變數資料所需要的空間.這些空間不會被轉移也不會被釋放,直接到程式退出時,才會被釋放.

全域性變數就是使用這一類的記憶體.如果全域性變數是一個類型別或是字串/動態陣列型別,使用到的全域性記憶體空間只有4byte或者8byte的物件參考而已

2.堆疊  heap(堆)與 stack(棧)  

堆疊是動態的記憶體區域,這個區域會依照後進先出的順序來配置與釋放。這意味著最後被配置的記憶體物件必須最先被刪除掉 .做個比喻:就是像彈匣一樣,後壓入的子彈會被先打出去!

堆疊記憶體一般是不會自動進行初始化也不會被自動清除的.這也是為什麼區域性變數一定要先初始化再使用的原因.

堆疊的大小通常是在編譯作業的過程就已經決定了的.

程式需要的記憶體空間分為 heap(堆) 和 stack(棧);

heap(堆)

 是自由儲存區, 需要手動申請、手動釋放 (手動擋).如果只申請不釋放, 就會發生"記憶體洩露";

stack(棧) 是自動儲存區,自動申請、自動釋放(自動擋).

不需要申請和釋放空間的元素, 譬如變數(var)、結構(record)等, 是存與 stack(棧);
反之如需要 Create 和 Free 的物件、需要 GetMem 和 FreeMem 的指標等, 則是存於 heap(堆);

時間上,stack(棧) 比 heap(堆)  快一點點.