【问题标题】:The difference between allocating an object on stack and on heap在堆栈和堆上分配对象的区别
【发布时间】:2020-08-24 17:43:32
【问题描述】:

这是一个关于 C# .NET 的非常普遍的问题。一些关于性能优化的技术总是尽可能在堆栈而不是堆上分配对象;使用stackalloc 而不是普通的Array,或者使用结构类型作为局部变量而不是类。我的问题是为什么在堆栈上分配对象会提高性能?在我看来,内存就是内存,所以分配对象的平均时间是一样的。是不是因为避免了垃圾回收?

【问题讨论】:

  • 谢谢,我看了那篇文章,说在栈上分配对象比在堆上快,但是为什么在栈上分配比在堆上快呢?
  • 我认为这只是因为垃圾收集器。它对它的要求会更少,就像堆一样,您还需要释放数组
  • 堆栈分配只涉及增加一个堆栈指针,堆分配需要找到空闲空间,它们的名字实际上是什么意思,分配给堆栈是否更容易,然后在堆中找到一个空闲点.. . 还有 GC 考虑,GC 认为堆栈上的所有内容都在运行(直到它不是),它的管理很简单,开销也少得多.. 总而言之,除非您有特定的设计目标或问题,否则我会将您的编程精力集中在其他事情上
  • “记忆只是记忆”是一个破碎的心智模型。 CPU 寄存器、L1、L2、L3 高速缓存和主存储 (RAM) 具有截然不同的访问时间。分配堆栈空间非常便宜,因为不需要锁(总是线程安全的)并且通常在 L1 缓存中很容易获得。您不能在堆栈中分配对象,它只能存储值。 C# 中存在值类型以增加获得最快可用内存、CPU 寄存器的几率。

标签: c# .net visual-studio .net-core


【解决方案1】:

当讨论涉及非托管代码时,垃圾收集器确实是一个重要因素,因为堆栈分配(使用 stackalloc)对它的要求会更少。请注意,在堆的情况下,垃圾收集器需要进行数组释放。另一方面,对于托管代码,分配是默认进行的(您无法选择如何分配)——引用类型在堆中分配,而值类型在堆栈中。

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 2018-09-09
    • 2017-11-08
    • 2014-05-30
    • 2012-06-26
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多