C#中使用指標實現高效比較字串的小技巧

來源:互聯網
上載者:User

判斷隨機字串之間的是否相等是程式設計中常用的技巧,再C++時代,我們可以通過把字串中每四個位元組轉換為一個int對象,通過int對象一次比較四個字元,從而實現相對高效的字串比較工作。那麼,這個思路在C#中能否是實現呢?答案是肯定的。

在C#中使用上述思想,必須要解決兩個問題,其一是在C#中使用指標,並且指標指向的託管變數位置不能被GC重新分配。其二,託管字串在記憶體中與int或long之間的對應關係。

很多文章中已經詳細描述了在C#中使用指標的方法,本文不再詳細敘述,開啟unsafe開關的方式為,按右鍵解決方案目錄——選擇屬性——再Build對話方塊中選中“允許unsafe代碼”選項, 這樣再C#中就可通過unsafe關鍵字標記可以使用指標的地區了。我們知道,被託管的變數由系統隨機分配、回收和調整在記憶體中的位置,因此,指向託管變數的指標可能會由於託管變數被隨機調整而指向錯誤地區。為了保證指標自始至終都能指向同一個託管變數,C#中提供了fixed語句來完成該任務。被標記了fixed的指標,在fixed所標誌的地區中回自始至終的指向改變數,而系統不會對該託管變數進行調整和再分配。代碼如下:

string str="Hello World!";
unsafe
{
fixed (char* ps = str)
{
//該地區中ps始終指向託管字串str
}
}

使用sizeof可以測出,C#中long佔用8個位元組,那麼在上面代碼中如果將ps的前8個位元組強轉為long型,得到的結果是什麼呢?我們利用如下代碼進行測試:

long n=0;
long nLow = 0, nHigh = 0;
string str = "Hello World!";
unsafe
{
fixed (char* ps = str)
{
char* psTemp = ps;
n=*(long*)psTemp;
nLow = n & 0xFFFF; //取最後兩個位元組
nHigh = (n >> 16) & 0xFFFF; //取第3,4個位元組
MessageBox.Show(((char)nLow).ToString() + " " + ((char)nHigh).ToString());
nLow = (n >> 32) & 0xFFFF; //取第5,6個位元組
nHigh = (n >> 48) & 0xFFFF; //取第7,8個位元組
MessageBox.Show(((char)nLow).ToString() + " " + ((char)nHigh).ToString());
}
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.