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

Delphi System.TMarshaller 與 TMarshal:記憶體緩衝區與字串轉碼的現代利器

     編輯:Delphi

TMarshaller (記錄型別) 基於 TMarshal (靜態類別方法) 實現,提供自動記憶體管理的安全緩衝區操作,徹底簡化非受控記憶體、字串編碼轉換等底層任務。

核心功能對比

特性TMarshallerTMarshal
型別記錄型別 (Record)類別 (Class) - 靜態方法
記憶體管理自動 (離開作用域釋放)手動
核心優勢RAII 風格,防洩漏提供 Copy 等額外實用方法

實戰測試:字串編碼轉換與記憶體複製

{測試}
procedure TForm1.FormCreate(Sender: TObject); 
var 
  M: TMarshaller; 
  pw: TPtrWrapper; 
  str: string; 
  bs: TBytes; 
begin 
  bs := BytesOf('萬一的 Delphi 博客'); 
  
  { 1. 配置非受控記憶體並複製位元組陣列 }
  pw := M.AllocMem(Length(bs)); 
  TMarshal.Copy(bs, 0, pw, Length(bs)); { TMarshal.Copy: 來源、來源索引、目標指標、長度 }
  
  { 2. 以 ANSI 讀取 }
  str := TMarshal.ReadStringAsAnsi(pw); 
  ShowMessage(str); 
  
  { 3. 以 UTF-8 寫入並讀回 }
  pw := M.AsUtf8(str); { 自動配置並寫入 UTF-8 位元組 }
  str := TMarshal.ReadStringAsUtf8(pw, -1); { -1 表示以 Null 結尾 }
  ShowMessage(str); 
end;

關鍵方法速查

  • TMarshaller.AllocMem(Size):配置非受控記憶體,自動釋放
  • TMarshaller.AsUtf8(String):字串轉 UTF-8 位元組並配置記憶體
  • TMarshaller.AsAnsi(String):字串轉 ANSI 位元組
  • TMarshal.Copy(Src, SrcIdx, Dest, Count):高效位元組複製
  • TMarshal.ReadStringAsAnsi/Utf8/Unicode(Ptr, Len):從指標讀取字串
  • TMarshal.PtrToStringAnsi/Utf8/Unicode(Ptr):便捷讀取

為何棄用舊式 GetMem/FreeMem

  1. 自動生命週期:TMarshaller 為記錄型別,離開作用域自動呼叫 FreeMem,杜絕洩漏
  2. 編碼內建:UTF-8/ANSI/Unicode 轉換一行搞定,無需手動 WideCharToMultiByte
  3. 型別安全:搭配 TPtrWrapper 替代 Pointer,64 位元無憂
  4. 效能相當:薄封裝層,幾乎零額外開銷

現代 Delphi 專案應全面採用 TMarshaller/TMarshal 處理非受控記憶體與編碼轉換,告別手動 GetMem/FreeMem 時代。

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