25.string对象堆内存分配问题
25.1 题目
static void Main(string[] args)
{
string str = "123";
string str2 = "123";
string str3 = "1234";
}
请问这三行代码,运行后,在堆上会分配几个“房间”?
25.2 深入解析
运行这三行代码后,在堆上会分配 2 个“房间”:
"123"一个房间。"1234"一个房间。
在 C# 中,字符串是不可变引用类型。上述字面量中,相同内容的 "123" 通常经编译期/驻留共享同一实例,故 str 与 str2 指向同一对象;"1234" 内容不同,再分配一个实例。因此堆上两个不同的字符串对象("123" 与 "1234" 各一)。
25.3 答题示例
“堆上会分配2个内存空间(房间)。
C#中字符串是不可变对象,但会通过字符串驻留(String Interning)优化相同内容的实例:
"123"被str和str2同时引用时,驻留池会共享同一个堆内存实例,因此只分配1次;"1234"与前者内容不同,会在堆上独立分配1次。
最终,堆上实际存储的唯一字符串是"123"和"1234",共2个实例。”
25.4 关键词联想
字符串驻留(String Interning)不可变对象(Immutable Object)堆内存分配(Heap Allocation)驻留池(Intern Pool)引用类型(Reference Type)内存共享(Memory Sharing)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com