首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 類別與記錄根本差異:實例化、記憶體模型與指標本質解析

     編輯:Delphi

核心差異一覽

特性記錄類別
關鍵字recordclass
記憶體配置棧上,直接包含資料堆上,變數是指標
變數大小資料總大小指標大小(32-bit=4Bytes, 64-bit=8Bytes)
建立方式宣告即可用需呼叫 Create 建構子
釋放方式離開作用域自動釋放需手動呼叫 Free
指派行為值複製參考複製(指向同一物件)
繼承支援不支援支援單一繼承
介面實作不支援支援
虛擬方法/多態不支援支援

程式碼實證


type
  TMyRecord = record
    D: TDate;
  end;

  TMyClass = class
    D: TDate;
  end;

var
  MyRec: TMyRecord;
  MyCls: TMyClass;
begin
  // 記錄:直接使用
  MyRec.D := Now;
  ShowMessage(DateToStr(MyRec.D));
  ShowMessage(IntToStr(SizeOf(MyRec))); // 8 bytes (TDate 大小)

  // 類別:需實例化
  MyCls := TMyClass.Create; // 配置堆記憶體
  MyCls.D := Now;
  ShowMessage(DateToStr(MyCls.D));
  ShowMessage(IntToStr(SizeOf(MyCls))); // 4 bytes (指標大小)

  MyCls.Free; // 手動釋放
end;

記憶體模型圖解

記錄變數 (Stack)          類別變數 (Stack) → 物件
+----------------+        +----------------+     +----------------+
| TDate 資料     |        | 指標 (4/8B)  | ──→ | TDate 資料     |
+----------------+        +----------------+     +----------------+
                                                         |  VMT 指標  |
                                                         +----------------+

設計選擇指南

  • 用 Record:簡單資料結構、高效能陣列、值語意、無繼承需求、跨 DLL 邊界傳遞。
  • 用 Class:複雜行為封裝、繼承多態、生命週期管理、介面導向設計、共享參考語意。

進階補充:進階記錄

Delphi 2007+ 支援進階記錄:可包含方法、建構子、屬性、運算子多載,但仍為值型別、無繼承、無虛擬方法表。

總結

類別本質是「指向堆上物件的指標」,記錄是「棧上直接資料」。理解這點,能避免常見錯誤(如未 Create 就存取、忘記 Free、指派誤以為複製值),並做出正確的架構決策。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved