讀書筆記—C#中字串駐留技術

來源:互聯網
上載者:User

    我很早以前就已經瞭解到字串駐留技術能夠最佳化記憶體佔用大小,但都印象不深,今天花了一些時間對這個問題進行的研究,加深了對它的理解。這裡就總結一下,便於以後學習和尋找,也希望能夠給朋友們帶來協助。謝謝!

MSDN概念:公用語言運行庫通過維護一個表來存放字串,該表稱為拘留池,它包含程式中以編程方式聲明或建立的每個唯一的字串的一個引用。因此,具有特定值的字串的執行個體在系統中只有一個。

上面的概念不好理解,我們還是從基礎說起:

一、眾所周知,C#中的string是一個參考型別,String對象存放在堆上,而不是在堆棧上的,因此,當把一個字串變數賦給另一個字串時,會得到記憶體中同一個字串的2個引用。但是為什麼我們修改一個字串的值,而另一個字串的值不受影響呢?原來當我們把一個字串的值賦給另一個字串時候,就會建立一個全新的String對象,就是說是分別指向堆中2個完全不同的地址空間。下面是一個簡單例子:

    static void Main(string[] args)
        {
           string s1 = "Charles";
           string s2 = s1; //注意此時會建立一個新對象
            Console.WriteLine("s1=" + s1);
           Console.WriteLine("s2=" + s2);
           s1 = "Charles Chen Change";
           Console.WriteLine("s1=" + s1);
           Console.WriteLine("s2=" + s2);  
        }

 

結果是:

s1=Charles
s2=Charles
s1=Charles Chen Change
s2=Charles

也就是說,改變s1的值並沒有改變s2的值,這實際上是和參考型別是矛盾的。其實當S1="Charles"時候,就在堆上分配了一個String對象,在S2=S1時候,引用也指向這個引用,但是當S1的值發生變化的時候,而不是替換原來的值,實際上是在堆上新分配一個記憶體空間,S2的值還是指向原來的對象,所以塔的值沒有發生變化。

二、然後我們看看下面的代碼塊:

string str1 = "CharlesChen";
string str2 = "CharlesChen";

當我們調用System.Object.Equals(str1,str2)時候,傳回值是True,根據對上面的理解,按道理說是應該返回為false,str1和str2應該指向不同的記憶體空間才對。怎麼會返回為true呢?這裡就引入了"字串駐留技術"。

其實這裡CLR使用了字串駐留技術,對於string str1="CharlesChen";string str2="CharlesChen";

當CLR初始化時,會建立一個內部的散列表(Hash表),其中的鍵位字串,值為指向託管堆中字串的引用。剛開始,散列表為空白,JIT編譯器編譯方法時,會在散列表中尋找每一個文本字串常量(這裡是"CharlesChen"),首先會尋找"CharlesChen",並且因為沒找到,編譯器會在託管堆中構造一個全新的指向"CharlesChen"的對象引用,然後將"abc"字串和執行該對象的引用添加到散列表中去。

當string str2="CharlesChen"時候,由於前面已經在散列表中加了該"CharlesChen"字串,所以編譯器不會執行任何分配記憶體空間的操作。首先編譯器會在內部的散列表中尋找"CharlesChen",並且會找到,這樣指向先前建立的String對象的引用就會被找到,並且這裡Str2就指向找到的那個引用。因此Str1和Str2就指向了記憶體中同一個地址的引用。所以System.Ojbect.Equals(str1,str2)就返回為true了。

 

相關資料:

http://www.cnblogs.com/coderlee/archive/2008/01/02/1023316.html 一個字串駐留技術的demo,加深對它的理解.

 

如果有什麼問題,歡迎朋友們指正,謝謝!

Charles Chen

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.