字符串类型是存储在堆上还是栈上?

Posted

技术标签:

【中文标题】字符串类型是存储在堆上还是栈上?【英文标题】:Is the string type stored on the heap or the stack? 【发布时间】:2014-04-01 08:27:25 【问题描述】:

让我感到困惑的是:在 .NET 中,string 类型是一个类,但它的行为看起来像是一个值类型!

那么string 是值类型(栈内存)还是引用类型(堆内存)?

【问题讨论】:

在堆栈上有指针的堆或作为另一个堆项集合的一部分,它是一个引用类型。 @AdamHouldsworth 所说的加上字符串池。 避免混淆 引用类型进入堆,值类型进入堆栈(not always)。 你的意思是但它的行为看起来像价值?你能解释一下其中的一些吗? 我的意思是 但如果我们有 2 个字符串变量,它的行为看起来像值 ?字符串 s1="koko",s2; s2=s1;这里 s2 将具有 s1 的值而不是内存地址 【参考方案1】:

System.String 是一个引用类型。类值行为实际上就是所谓的“不变性”,即对象一旦创建就无法更改。您希望改变对象的所有操作(例如.ToUpper())都会创建一个新实例。

可变性与某事物是引用类型还是值类型是不同的主题。您可以拥有可变值类型(尽管它们被认为是 Bad Idea™)。


对于分配问题,简单的回答是引用类型通常分配在堆上,值类型通常分配在堆栈上。

在The Truth About Value Types 中,Eric Lippert 解释了 CLR 如何更多地基于生命周期做出分配决策。通常这些是您不需要担心的细节,但无论如何,这些都是有趣的信息。

【讨论】:

@Oyeme 感谢您告诉我们 - 我找到了它的新家并更新了链接。

以上是关于字符串类型是存储在堆上还是栈上?的主要内容,如果未能解决你的问题,请参考以下文章

对象的私有成员是在堆上还是在栈上?

C++中,静态数组在内存中是存储在堆上,还是栈上,还是在静态存储区中?

JAVA中的类成员变量是存在堆还是栈里面呀?

Go 语言中的变量究竟是分配在栈上还是分配在堆上?

Go 语言中的变量究竟是分配在栈上还是分配在堆上?

java创建对象时分配内存方式,是堆上分配还是栈上分配?