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

C# 使用指標高效比較字串 (1) — unsafe 與 fixed 實現

     編輯:關於C語言

背景

C++ 時代常將字串每 4 位元組轉為 int 比較,一次比較 4 字元。C# 能否做到?答案是肯定的,需解決兩個問題:

  1. 在 C# 使用指標,且防止 GC 移動托管物件。
  2. 托管字串在記憶體中與 int/long 的對應關係。

啟用 unsafe 與 fixed

  • 專案屬性 → Build → 勾選 Allow unsafe code。
  • 使用 unsafe 關鍵字標記區塊。
  • 使用 fixed 陳述式釘住托管字串,防止 GC 重新定位:

string str = "Hello World!";
unsafe
{
    fixed (char* ps = str)
    {
        // 此區塊中 ps 始終指向 str,GC 不會移動它
    }
}

字串記憶體佈局驗證

long 佔 8 位元組 (4 個 char)。將 char* 強轉為 long* 讀取:


long n = 0;
string str = "Hello World!";
unsafe
{
    fixed (char* ps = str)
    {
        char* psTemp = ps;
        n = *(long*)psTemp; // 讀取前 4 個 char (8 位元組)

        long nLow = n & 0xFFFF;         // 低 2 位元組 (第 1 個 char)
        long nHigh = (n >> 16) & 0xFFFF; // 高 2 位元組 (第 2 個 char)
        MessageBox.Show(((char)nLow).ToString() + " " + ((char)nHigh).ToString()); // H e

        nLow = (n >> 32) & 0xFFFF;      // 第 3 個 char
        nHigh = (n >> 48) & 0xFFFF;     // 第 4 個 char
        MessageBox.Show(((char)nLow).ToString() + " " + ((char)nHigh).ToString()); // l l
    }
}

觀察結果

  • 字串在記憶體中為 UTF-16 (每字元 2 位元組) 連續儲存。
  • long 可一次讀取 4 個字元,位元操作可拆解各字元。
  • 此技巧可用於高效比較長字串:逐塊比較 long,最後處理餘數。

後續將展示完整的高效字串比較實現。

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