zoukankan      html  css  js  c++  java
  • 【C#】CLR内存那点事(string)

    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#,这个时候会去字符常量池中找,找到了就存这个引用。

  • 相关阅读:
    利用DTrace实时检测MySQl
    改进MySQL Order By Rand()的低效率
    RDS for MySQL查询缓存 (Query Cache) 的设置和使用
    RDS For MySQL 字符集相关说明
    RDS for MySQL 通过 mysqlbinlog 查看 binlog 乱码
    RDS for MySQL Mysqldump 常见问题和处理
    RDS for MySQL Online DDL 使用
    RDS MySQL 表上 Metadata lock 的产生和处理
    RDS for MySQL 如何使用 Percona Toolkit
    北京已成为投融资诈骗重灾区:存好骗子公司黑名单,谨防上当!
  • 原文地址:https://www.cnblogs.com/guochenkai/p/3881227.html
Copyright © 2011-2022 走看看