【问题标题】:Benefit of allocating object on stack?在堆栈上分配对象的好处?
【发布时间】:2014-05-30 20:02:41
【问题描述】:

成分:

  • 两种语言——例如 C++ 和 C#
  • 一种方式比具有两个成员(字段xy)的Point 更复杂

在 C# 中,此类类型将被定义为引用类型,强制它始终在堆上分配它。在 C++ 中,分配是按用途定义的,而不是按类型定义,因此可以在堆栈上分配。

这样做的好处是 RAII 模式,具有在对象超出范围后自动清理数据的效果。在 C# 中,您必须使用 using 作为明确的“清理范围”(这也是由于非确定性 GC)。

我知道的第二个是速度——堆栈访问速度更快。

我的问题是——与总是在堆上(如 C# )?

真实的 -- 更可取的是,我正在寻找“始终在堆上”方法不可用的东西,因为 RAII 毕竟是用不同的语法解决的。

本题不涉及C#中的值类型(结构体)!是跨语言比较。

【问题讨论】:

  • 问题是,RAII 是一个包罗万象的好东西。您还没有提到异常安全,即带有异常的 RAII(假设代码在某个级别的 try 块中运行)。
  • @juanchopanza,谢谢,但它已经基于 RAII,我指出了 C# 世界中的对应物。

标签: c# c++ heap-memory stack-memory


【解决方案1】:

除了 RAII 和 在堆栈上分配复杂对象的速度

之外,还有其他真正的好处吗(命名一个就足够了)

是的,这比分配速度重要得多:访问速度。通过摆脱不必要的间接,您可以获得显着的性能改进。 Herb Sutter 最近给了an interesting talk,其中包括他对连续记忆的强烈热爱。他引用的一个示例项目通过使预取器的工作更轻松,将性能提高了 50 倍。 (是的,我们说的是快 50 倍,而不是快 50%!)

【讨论】:

  • :-D 这是一个有趣的误解——没有“能力的速度”之类的东西,短语是“能力的好处”,我提到了速度。
  • @greenoldman 你几乎涵盖了所有可能使编程功能变得更好的东西。
【解决方案2】:

这不是您问题的真正答案,但它比评论要长。

在 C# 中,值类型在堆栈上分配而引用类型在堆上分配是一种误解。值类型没有被定义为堆栈中的东西。这是一个实现细节,而不是设计规范。规范是值类型按值复制。这并不意味着它们必须存储在堆栈中。可以实现一个完全不使用堆栈的 C# 编译器。值或引用类型的实例进入堆栈、堆或寄存器,具体取决于它们是短期存在的还是长期存在的。不存储在堆栈中的值类型的示例是

  • 类中的字段
  • 盒装值类型
  • 匿名方法的外部变量
  • 迭代器块的外部变量

有关更多信息,我建议阅读 Eric Lippert 关于此事的帖子:

【讨论】:

    【解决方案3】:

    堆栈模型与堆+GC 相比的一个好处是它更具确定性。当然,在实时系统中,衡量一个函数需要多长时间是很有用的,但当一些清理成本发生在未指定的稍后时间时,这很困难。

    【讨论】:

      猜你喜欢
      • 2013-01-25
      • 1970-01-01
      • 2020-08-24
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      相关资源
      最近更新 更多