【问题标题】:Does .Net create 1 stack(to store value types) for each dll and exe or 1 stack per program.Net 是否为每个 dll 和 exe 创建 1 个堆栈(用于存储值类型)或每个程序创建 1 个堆栈
【发布时间】:2012-02-17 13:05:20
【问题描述】:

我正在创建一个将由演示程序使用的服务。我正在将我的类型定义为类或结构。 .Net 是否为每个 dll 和 exe 创建 1 个堆栈(用于存储值类型)或每个程序创建 1 个堆栈。我非常确定它会为每个程序创建一个托管堆,但不确定堆栈。请帮帮我。

谢谢, 奥姆卡

【问题讨论】:

  • 这有关系吗?这是一个实现细节。您假设您知道引用类型和值类型将在哪里结束。请参阅 Eric Lippert 在 The Stack is An Implementation Detail 上的博客文章。
  • 是的,这很重要,如果我需要将结构从一个程序集的一个函数传递到另一个,它将复制所有不利于性能的值...
  • 您是否有一些特定的性能问题已被 Oded 认定为与此实现细节相关的应用程序瓶颈?
  • 在针对这种情况进行优化之前,请确保您确实遇到了问题。您是否衡量了性能并发现这是问题所在?
  • 如果复制局部变量的成本太高,很可能它们一开始就不应该是结构。在性能关键代码中也有一些例外,例如 XNA,但通常只有非常小的类型才应该是值类型。

标签: c# java .net memory-management


【解决方案1】:

首先The Stack Is An Implementation Detail

碰巧在一个进程中每个进程有 1 个堆*,每个线程 有 1 个堆栈,但是您不应该关心这一点,当然也不应该在类和结构之间进行选择时使用它.

When to use struct in C#?

(*) 好吧,1 个托管堆。

【讨论】:

  • 这篇文章 The Stack Is An Implementation Detail 非常好,谢谢@Justin!
【解决方案2】:

由于一个调用堆栈可能包含来自不同程序集的调用,并且每个线程都有自己的堆栈跟踪,显然每个线程只有一个堆栈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2018-11-07
    • 2016-12-06
    • 2012-03-22
    相关资源
    最近更新 更多