25.string对象堆内存分配问题

  1. 25.string对象堆内存分配问题
    1. 25.1 题目
    2. 25.2 深入解析
    3. 25.3 答题示例
    4. 25.4 关键词联想

25.string对象堆内存分配问题


25.1 题目

static void Main(string[] args)
{
    string str = "123";
    string str2 = "123";
    string str3 = "1234";
}

请问这三行代码,运行后,在堆上会分配几个“房间”?


25.2 深入解析

运行这三行代码后,在堆上会分配 2 个“房间”:

  1. "123" 一个房间。
  2. "1234" 一个房间。

在 C# 中,字符串是不可变引用类型。上述字面量中,相同内容的 "123" 通常经编译期/驻留共享同一实例,故 strstr2 指向同一对象;"1234" 内容不同,再分配一个实例。因此堆上两个不同的字符串对象"123""1234" 各一)。


25.3 答题示例

“堆上会分配2个内存空间(房间)。
C#中字符串是不可变对象,但会通过字符串驻留(String Interning) 优化相同内容的实例:

  • "123"strstr2同时引用时,驻留池会共享同一个堆内存实例,因此只分配1次;
  • "1234" 与前者内容不同,会在堆上独立分配1次。
    最终,堆上实际存储的唯一字符串是"123""1234",共2个实例。”

25.4 关键词联想

  • 字符串驻留(String Interning)
  • 不可变对象(Immutable Object)
  • 堆内存分配(Heap Allocation)
  • 驻留池(Intern Pool)
  • 引用类型(Reference Type)
  • 内存共享(Memory Sharing)


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏