C#之CLR內(nèi)存字符串常量池(string)
C#中的string是比特殊的類,說(shuō)引用類型,但不存在堆里面,而且String str=new String("HelloWorld")這樣的重裝也說(shuō)沒(méi)有的。
我們先來(lái)看一個(gè)方法:
class Program { static void Main(string[] args) { String s = "HelloWorld"; Console.WriteLine(s); } }
然后我們用ildasm.exe工具把它生成IL語(yǔ)言來(lái)看一看它里面是怎么玩的:
.method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 15 (0xf) .maxstack 1 .locals init ([0] string s) IL_0000: nop IL_0001: ldstr "HelloWorld" IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: call void [mscorlib]System.Console::WriteLine(string) IL_000d: nop IL_000e: ret } // end of method Program::Main
我們?cè)诶锩娌](méi)有看見(jiàn)newObj(所以我們認(rèn)為不在堆里面)的指令,只有一個(gè)特殊ldstr(load string)指令,它用從元數(shù)據(jù)獲取一個(gè)文本常量字符串(字符串常量池)構(gòu)造一個(gè)String對(duì)象。這證明了CLR說(shuō)用一種特殊的方式構(gòu)造了字符串。
我們?cè)倥e一個(gè)簡(jiǎn)單例子看看:
class Program { static void Main(string[] args) { String s = "HelloWorld"; s = "HelloC#"; s = "HelloJava"; String s1= "HelloC#"; Console.WriteLine(s); } }
對(duì)照這個(gè)例子我們來(lái)看看內(nèi)存圖是怎么走的:
首先CLR內(nèi)部機(jī)制會(huì)在運(yùn)行這個(gè)方法之前就會(huì)有"prologue"代碼去開(kāi)辟內(nèi)存空間,s和s1就說(shuō)這個(gè)時(shí)候創(chuàng)建的。
我們創(chuàng)建了一個(gè)s的字符串對(duì)象,賦值為HelloWorld,把s插入棧,然后內(nèi)部機(jī)制去字符串常量池中找HelloWorld副本,發(fā)現(xiàn)沒(méi)有找到就會(huì)創(chuàng)建一個(gè),接著會(huì)去保存這個(gè)HelloWorld在字符串常量池中的地址(Line1)。然后我們?yōu)閟對(duì)象在賦值為HelloC#,由于同一個(gè)對(duì)象,棧中不做操作,去字符串常量池中找,沒(méi)找到則創(chuàng)建,然后修改s所存儲(chǔ)的地址(line 2),HelloJava同樣的操作。 再創(chuàng)建一個(gè)s1的string對(duì)象,把s1壓入棧,為S1賦值HelloC#,這個(gè)時(shí)候會(huì)去字符常量池中找,找到了就存這個(gè)引用。
相關(guān)文章
C#實(shí)現(xiàn)讓窗體獲得焦點(diǎn)的方法示例
這篇文章主要介紹了C#實(shí)現(xiàn)讓窗體獲得焦點(diǎn)的方法,涉及C#窗體事件相關(guān)操作技巧,需要的朋友可以參考下2017-06-06c#根據(jù)網(wǎng)址抓取網(wǎng)頁(yè)截屏生成圖片的示例
本文主要介紹了c#根據(jù)網(wǎng)址抓取網(wǎng)頁(yè)截屏生成圖片并保存的示例,代碼中使用了WebBrowser控件來(lái)完成這個(gè)功能,大家參考使用吧2014-01-01C#中動(dòng)態(tài)顯示當(dāng)前系統(tǒng)時(shí)間的實(shí)例方法
想在網(wǎng)頁(yè)中動(dòng)態(tài)地顯示當(dāng)前系統(tǒng)的時(shí)間,找了好多,不過(guò)都是一些停在那里不動(dòng)的。。。不過(guò)皇天不負(fù)有心人,終于讓我找到了2013-05-05C#實(shí)現(xiàn)協(xié)同過(guò)濾算法的實(shí)例代碼
這篇文章介紹了C#實(shí)現(xiàn)協(xié)同過(guò)濾算法的實(shí)例代碼,有需要的朋友可以參考一下2013-07-07一個(gè)可攜帶附加消息的增強(qiáng)消息框MessageBoxEx
一個(gè)可攜帶附加消息的增強(qiáng)消息框MessageBoxEx分享給大家,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04