博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有意思的字符串拘留实验
阅读量:6816 次
发布时间:2019-06-26

本文共 1894 字,大约阅读时间需要 6 分钟。

本次字符串拘留实验分为4个,最终根据实验得出了一个很有意思的结论。这些结论使兄弟们在以前关于字符串操作的结论基础上进行深入理解。(关于字符串拘留池,请Google一下String Intern Pool,你可以搜索到不少东西的。)

Main中没有出现硬字符串

            string a1 = new string('a', 1);

            string a2 = new string('a', 1);

            Console.WriteLine(a1);

            Console.WriteLine(string.IsInterned(a1) != null);

            Console.WriteLine(ReferenceEquals(a1, a2));

> a

> False

> False 

Main中出现硬字符串

            string a1 = new string('a', 1);

            string a2 = new string('a', 1);

            Console.WriteLine(a1);

            Console.WriteLine(string.IsInterned(a1) != null);

            Console.WriteLine(string.IsInterned("a") != null);

            Console.WriteLine(ReferenceEquals(a1, a2));

> a

> True

> True

> False 

注意:为什么第一个IsInterned竟然得出a已经拘留了呢?呵呵。

Main中不出现硬字符串,但在另一个类出现硬字符串,不过另一个类没有被使用

            // a1 和 a2都不在拘留池,且地址不一样。

            string a1 = new string('a', 1);

            string a2 = new string('a', 1);

            Console.WriteLine(a1);

            Console.WriteLine(string.IsInterned(a1) != null);

            Console.WriteLine(ReferenceEquals(a1, a2));

 

class StringInternPoolTest1

    {

        public StringInternPoolTest1()

        {

            string a1 = new string('a', 1);

            Console.WriteLine(string.IsInterned(a1) != null);

            string a = "a";

        }

}

> a

> False

> False 

Main中不出现硬字符串,但使用了另一个具有硬字符串的类

            string a1 = new string('a', 1);

            string a2 = new string('a', 1);

            Console.WriteLine(a1);

            Console.WriteLine(string.IsInterned(a1) != null);

            Console.WriteLine(ReferenceEquals(a1, a2));

            StringInternPoolTest1 test = new StringInternPoolTest1();

 

class StringInternPoolTest1

    {

        public StringInternPoolTest1()

        {

            string a1 = new string('a', 1);

            Console.WriteLine(string.IsInterned(a1) != null);

            string a = "a";

        }

}

> a

> False

> False

> True 

 

本次实验结论:

只有硬字符串才能被拘留;

JIT编译方法后,执行前会将一个方法的所有硬字符串拘留;

3 string x = "a" 不会执行内存分配,原因很简单,在该语句之前JIT已经执行字符串拘留,即JIT提前分配了字符串的所需的内存以及字符串拘留池项。

 

其它待实验论点:

只有CLR执行结束,拘留字符串才能被释放;

拘留一个字符串的行为为将引用添加到CLR的一个Hashtable,它始终对字符串进行引用,从而阻止GC对拘留字符串进行回收;

3 编译器的优化行为(大家可以猜测一下如何优化,呵呵)。 

本文转自道法自然博客园博客,原文链接:http://www.cnblogs.com/baihmpgy/archive/2010/03/02/1676842.html,如需转载请自行联系原作者

你可能感兴趣的文章
ArrayList和LinkedList区别
查看>>
深入tornado中的IOStream
查看>>
EasyUI DataGrid 分页示例
查看>>
ID基本操作(出血的定义)(置入图片)(添加页面)5.15
查看>>
0913数据库约束之主键 外键 非空 默认值约束 唯一约束 级联操作 表与表之间的联系...
查看>>
bzoj千题计划204:bzoj2813: 奇妙的Fibonacci
查看>>
卡尔曼滤波器原理之基本思想(一)
查看>>
微信 {"errcode":40029,"errmsg":"invalid code, hints: [ req_id: Cf.y.a0389s108 ]"}
查看>>
appserv安装
查看>>
SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
查看>>
2018-2019-2 20165325 《网络对抗技术》 Exp5:MSF基础应用
查看>>
Java基础扫盲系列(二)—— Java中BigDecimal和浮点类型
查看>>
如何在直播中解决黑屏、花屏、闪屏问题 | 直播疑难杂症排查
查看>>
js获取浏览器高度和宽度值(多浏览器)
查看>>
Deep learning:十六(deep networks)
查看>>
▲移动web前端开发
查看>>
LeetCode: Palindrome Partition
查看>>
推荐使用C++ 11
查看>>
C#中的接口
查看>>
osg学习示例之遇到问题四骨骼动画编译osgCal
查看>>