国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#之CLR內存字符串常量池(string)

2020-01-24 02:36:33
字體:
來源:轉載
供稿:網友

C#中的string是比特殊的類,說引用類型,但不存在堆里面,而且String str=new String("HelloWorld")這樣的重裝也說沒有的。

我們先來看一個方法:

class Program{  static void Main(string[] args)  {    String s = "HelloWorld";    Console.WriteLine(s);  }}

然后我們用ildasm.exe工具把它生成IL語言來看一看它里面是怎么玩的:

.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

我們在里面并沒有看見newObj(所以我們認為不在堆里面)的指令,只有一個特殊ldstr(load string)指令,它用從元數據獲取一個文本常量字符串(字符串常量池)構造一個String對象。這證明了CLR說用一種特殊的方式構造了字符串。

我們再舉一個簡單例子看看:

class Program{  static void Main(string[] args)  {    String s = "HelloWorld";    s = "HelloC#";    s = "HelloJava";    String s1= "HelloC#";    Console.WriteLine(s);  }}

對照這個例子我們來看看內存圖是怎么走的:

首先CLR內部機制會在運行這個方法之前就會有"prologue"代碼去開辟內存空間,s和s1就說這個時候創建的。

我們創建了一個s的字符串對象,賦值為HelloWorld,把s插入棧,然后內部機制去字符串常量池中找HelloWorld副本,發現沒有找到就會創建一個,接著會去保存這個HelloWorld在字符串常量池中的地址(Line1)。然后我們為s對象在賦值為HelloC#,由于同一個對象,棧中不做操作,去字符串常量池中找,沒找到則創建,然后修改s所存儲的地址(line 2),HelloJava同樣的操作。 再創建一個s1的string對象,把s1壓入棧,為S1賦值HelloC#,這個時候會去字符常量池中找,找到了就存這個引用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 壶关县| 涞源县| 南召县| 东山县| 青田县| 邹平县| 汤阴县| 江孜县| 台江县| 越西县| 长沙县| 师宗县| 达州市| 玉林市| 青龙| 高邑县| 新竹市| 比如县| 凯里市| 壶关县| 南平市| 海南省| 内江市| 大连市| 包头市| 繁峙县| 苏尼特左旗| 库车县| 旅游| 丹凤县| 城步| 永州市| 徐汇区| 武山县| 华阴市| 建瓯市| 女性| 雷波县| 分宜县| 余干县| 青阳县|