从内存分配的角度来看,
struct
(在大多数情况下)在堆栈上分配,而class
在堆上分配。每个人都有自己的权衡。并且 struct
与 class
始终包含在 C# 工作面试中。
现在有了.NET 9逃逸分析,如果我的理解是正确的,这个概念就不再正确了,类将根据JIT判断来分配。我说得对吗?
什么都没有改变,也不会改变。这是一项优化,目前有限。正如 Stephen Toub 在 .NET 9 中的性能改进中所解释的那样:
在 .NET 9 中,对象堆栈分配开始发生。别太兴奋了,目前它的范围有限,但将来它可能会进一步扩大。
和
...它仅限于处理可以轻松证明对象引用没有离开当前帧的情况。即便如此,在很多情况下这将有助于消除分配,我预计它会在未来得到扩展以处理越来越多的情况。当 JIT 选择在堆栈上分配对象时,它会有效地将对象的字段提升为堆栈帧中的单独变量。
即使在更高版本上,这也不会改变值类型和引用类型之间的差异。它不会开始在引用类型中生成防御性副本或值相等,也不会允许在堆栈上分配大列表或缓冲区,或者在将对象传递给方法时强制复制。