C# 字符串文字和内存表示
如果我有这个:C# 字符串文字和内存表示,c#,C#,如果我有这个: string str = "string"; 我们可以说堆上创建了一个string 包含“字符串” 或 由于实习,CLR是否将该文字创建到实习中 在str对象中引用的池 那么,基本上,这个比喻是正确的: str --> [ methods, fields, ..., "string"] 或者这是正确的 str --> [ methods, fields, ..., ---> "string"] 其中,[]表示对象。根据: 公共语言运行库自动维护一个名为 实
string str = "string";
我们可以说堆上创建了一个string
包含“字符串”
或
由于实习,CLR是否将该文字创建到实习中
在str
对象中引用的池
那么,基本上,这个比喻是正确的:
str --> [ methods, fields, ..., "string"]
或者这是正确的
str --> [ methods, fields, ..., ---> "string"]
其中,[]
表示对象。根据:
公共语言运行库自动维护一个名为
实习生池,其中包含每个唯一用户的单个实例
程序中声明的文本字符串常量,以及任何唯一
通过调用Intern以编程方式添加的字符串的实例
方法
字符串不像普通对象那样在堆上创建,以证明这一点——如果创建两个具有相同值的字符串,如
string str = "string";
string anotherStr = "string";
调用Object.ReferenceEquals(str,anotherStr)
返回true
您还可以根据以下内容检查字符串是否在字符串池中:
公共语言运行库自动维护一个名为
实习生池,其中包含每个唯一用户的单个实例
程序中声明的文本字符串常量,以及任何唯一
通过调用Intern以编程方式添加的字符串的实例
方法
字符串不像普通对象那样在堆上创建,以证明这一点——如果创建两个具有相同值的字符串,如
string str = "string";
string anotherStr = "string";
调用Object.ReferenceEquals(str,anotherStr)
返回true
您还可以检查字符串是否在字符串池中,您真正想问的是 插入的字符串是否存储为string类的成员 我还没有找到一个确定的来源来证实这一点,但我非常确定,被插入的字符串是由CLR在string类的内存范围之外维护的。这由调用
线程
类上的方法表示:
public static String Intern(String str) {
if (str==null) {
throw new ArgumentNullException("str");
}
return Thread.GetDomain().GetOrInternString(str);
}
如果interning影响了string
类的内存占用,我希望Intern
函数调用string
类中的方法,而不是调用Thread
然而,这是一个实现细节(因为我找不到它的一部分),在规范的不同实现之间可能有所不同 插入的字符串是否存储为string类的成员 我还没有找到一个确定的来源来证实这一点,但我非常确定,被插入的字符串是由CLR在string类的内存范围之外维护的。这由调用
线程
类上的方法表示:
public static String Intern(String str) {
if (str==null) {
throw new ArgumentNullException("str");
}
return Thread.GetDomain().GetOrInternString(str);
}
如果interning影响了string
类的内存占用,我希望Intern
函数调用string
类中的方法,而不是调用Thread
然而,这是一个实现细节(因为我找不到它的一部分),并且在规范的不同实现之间可能有所不同。根据这一点,可能会使这个问题重复,您创建的字符串对象始终在堆上,无论它是否处于内部。当您插入一个字符串时,表(或插入池,其本身位于LOH上)将创建一个新的引用,该引用指向您之前已创建的相同对象(在堆上)。您可以看到,其中还明确提到,当您创建字符串
对象时,会使用堆上的内存,不管它是否被占用
将字符串的内存放在其他地方并不是什么神奇的事情,可以将其视为现有字符串的查找表,以便在字符串与另一个字符串相同时节省内存 根据这一点,您创建的string
对象始终位于堆上,无论是否被占用。当您插入一个字符串时,表(或插入池,其本身位于LOH上)将创建一个新的引用,该引用指向您之前已创建的相同对象(在堆上)。您可以看到,其中还明确提到,当您创建字符串
对象时,会使用堆上的内存,不管它是否被占用
将字符串的内存放在其他地方并不是什么神奇的事情,可以将其视为现有字符串的查找表,以便在字符串与另一个字符串相同时节省内存 当然,你可以为你的研究提供一些证据……这要视情况而定。值“string”
可能在数据段中,因为它是一个常量,而不是在他不知道从何处查找的堆中。。。为了保持这个问答网站。让他看一下,您是否在询问是否将插入的字符串存储为string类的属性?我非常确定字符串池是由CLR维护的,而不是嵌入到string类中。但是,这可能是一个需要更改的实现细节。据我所知,在手动调用String.Intern
方法之前,运行时字符串不会被保留。所以,在给实习生打电话之前,我认为第一个案例是正确的;在打电话给第二个案例后,情况就变得正确了。当然,你可以提供一些证据证明你的研究……这要看情况而定。值“string”
可能在数据段中,因为它是一个常量,而不是在他不知道从何处查找的堆中。。。为了保持这个问答网站。让他看一下,您是否在询问是否将插入的字符串存储为string类的属性?我非常确定字符串池是由CLR维护的,而不是嵌入到string类中。然而,这可能是一个需要更改的实现细节