【问题标题】:Stack capacity in C#C# 中的堆栈容量
【发布时间】:2010-10-23 20:23:20
【问题描述】:

谁能告诉我 C# 中的堆栈容量是多少。

我正在尝试使用包含 30,000 个项目的数组来形成一个 3D 网格封闭对象。

【问题讨论】:

  • 你可以自己测试一下,在上面放上万亿个项目,看看它什么时候崩溃?
  • 一个密切相关的问题是Stack size under Mono

标签: c# .net clr stack


【解决方案1】:

.NET 应用程序的默认堆栈大小为 1 MB(32 位 ASP.NET 应用程序的默认堆栈大小为 256 KB,64 位 ASP.NET 应用程序的默认堆栈大小为 512 KB),但您可以更改它。对于应用程序,您可以通过修改可执行文件的 PE 标头来更改默认大小。对于您创建的线程,您可以使用采用堆栈大小的构造函数重载。

但正如 Anton Tyjhyy 在他的回答中指出的那样,数组是引用类型,因此位于堆上(即使数组恰好包含一堆值类型)。

【讨论】:

  • ASP.Net 应用程序的 256 KB 大小适用于 32 位应用程序。在 64 位 Windows Server 2008 及更高版本上,堆栈大小已推至 512 KB。有关详细信息,请参阅 KB 932909。
  • @BrianRasmussen 您实际上可以使用stackalloc 在堆栈上分配一个数组。此外,仅仅因为某些东西是引用类型并不一定意味着它将在堆栈或堆上分配,它因 CLR 的实现而异,在 .NET 实现中,它在一些特殊情况下(类型的大小和范围)。
  • @MichaelJ.Gray 我不知道引用类型实例不在托管堆上的任何实现。你有这方面的例子吗?
  • @BrianRasmussen 查看 Eric Lippert 的文章 The Stack Is An Implementation Detail。这是一个思想实验。而且读起来也不错。
  • @CristiDiaconescu 谢谢。我知道这篇文章。
【解决方案2】:

您的数组将位于堆上,堆栈大小与您的情况无关。

【讨论】:

    【解决方案3】:

    要使用堆栈来存储数组,您必须使用带有指针和 stackalloc 的不安全代码来在堆栈上分配所需的内存空间。

    【讨论】:

      【解决方案4】:

      如果要检查当前 .NET 程序集的值,可以使用 Visual Studio 命令提示符附带的 ILDASM 命令来完成。启动该工具后,打开程序集,然后转到 View -> Headers 菜单。现在向下滚动到新打开的Headers 窗口中的PE Optional Header (32 bit) 部分。您将看到两个字段:

      1. 堆栈保留的大小 - 这是不言自明的。这是分配给您的程序/应用程序中创建的任何线程的默认堆栈内存大小。
      2. 堆栈提交的大小 - 已提交的堆栈空间是 - (引用来自 here 的 Hans Passant)

      上述空间保留在操作系统的页面文件中,所以 必要时可以随时换出堆栈。

      【讨论】:

        猜你喜欢
        • 2012-01-08
        • 2021-12-18
        • 1970-01-01
        • 2011-04-13
        • 2017-01-04
        • 2011-04-28
        • 1970-01-01
        相关资源
        最近更新 更多