【问题标题】:Is it possible to create an instance of a class on the stack?是否可以在堆栈上创建类的实例?
【发布时间】:2017-06-21 02:05:12
【问题描述】:

我知道在 C++ 中,您可以在堆栈上创建一个类的实例,例如

MyClass mc = MyClass(8.2);

或在堆上

MyClass * mc = new MyClass(8.2);

你能在 C# 中做同样的事情吗?我在 C# 中创建类的唯一方法是 newing 它。

【问题讨论】:

  • 这只是语义,对象仍然存在于 GC 堆上。发明以拯救 RAII 模式。很大程度上是一个失败,最终让程序员不知道什么时候使用帽子,让他们编写效率非常低的代码,而且经常被框住。
  • C# 是托管堆内存模型 - 重点是您不必花时间担心内存清理。您是否有理由将某些东西放在堆栈上而不是堆上? FWIW,C# 结构(值类型)通常位于堆栈上,类(引用类型)位于堆上 - 但内存管理器可能会根据大小和使用情况选择对其进行装箱。
  • @GeoffCox 当一个值类型被装箱时是很好定义的。当您将值存储在引用类型的存储位置时,它将始终将值装箱,否则永远不会。它不会随心所欲地选择何时或何时不对值进行装箱。现在一个变量本身很可能有许多可能的存储位置,并且变量本身的存储位置可以随语言/运行时的变化而变化,但这与装箱无关。

标签: c# heap-memory new-operator memory-model stack-memory


【解决方案1】:

不,这是不可能的。所有类的所有实例总是在堆上分配。

值类型,包括用户定义的 struct 类型,保存值,而不是对其他地方的值的引用,可以将值存储在变量碰巧存储其值的任何位置,可能不是堆.

【讨论】:

  • @Dan 它们被分配在某个“其他位置”,用于存储生命周期未知的对象。 CLR 将该位置称为“堆”。
  • 我同意@Dan 我记得 CLR 是免费的,例如可以在堆栈上创建仅在本地(在局部变量中)使用的实例。
  • @RenéVogt 要求变量是对别处对象的引用,而不是让变量存储值,并且要求引用的存储位置能够存在不确定的时间(堆栈帧不是这样)。
猜你喜欢
  • 2019-09-22
  • 2019-07-27
  • 2010-12-06
  • 2014-10-23
  • 2015-03-12
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多