C#中的字符串常量内存池

时间:2013-09-16 15:27:14

标签: c# string memory

每个人都知道.Net框架中的String对象直接存储在堆内存中

我只是想了解.Net框架中是否有任何用于字符串的保留内存。在java中,有一个名为SCMP(字符串常量内存池)的字符串保留内存,其中字符串初始化和垃圾收集就像堆内存中的其他对象一样。

3 个答案:

答案 0 :(得分:6)

我不认为.Net中有类似的东西。

相反,我读过 this ,其中有趣的是如何使用字符串:

  

CLR维护一个名为实习池的表,其中包含   程序中的文字字符串。这确保了重复使用   代码中相同的常量字符串将使用相同的字符串   参考。 System.String类提供了一个Intern方法   确保字符串位于实习池中并返回引用   它

同时检查此MSDN: -

  

我们已经看到了托管堆包含的许多场景   相同的字符串重复了数千次。结果是一个很大的工作   设置字符串消耗大量内存的位置。在这   情况,通常最好使用 string interning.

答案 1 :(得分:2)

在.NET中,文字字符串是“实习”的,因此每个文字字符串只有一个副本。

请参阅http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

答案 2 :(得分:1)

.Net框架在表Intern Pool中保存字符串存储。你可能会看到:

String interning and String.Empty - Eric Lippert

  

如果在一个编译单元中有两个相同的字符串文字,那么   我们生成的代码确保只创建一个字符串对象   CLR用于程序集中该文字的所有实例。这个   优化称为“字符串实习”。

String Interning .Net framework

  

公共语言运行库通过维护来保存字符串存储   表,称为实习池,包含对其的单个引用   以编程方式声明或创建的每个唯一文字字符串   你的计划。因此,带有一个文字字符串的实例   特殊值仅在系统中存在一次。

相关问题