C++ 時代常將字串每 4 位元組轉為 int 比較,一次比較 4 字元。C# 能否做到?答案是肯定的,需解決兩個問題:
int/long 的對應關係。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
}
}
long 可一次讀取 4 個字元,位元操作可拆解各字元。long,最後處理餘數。後續將展示完整的高效字串比較實現。