C#中的堆栈容量

58

请问C#中的堆栈容量是多少。

我正在尝试使用包含30,000个项目的数组来构建一个三维网格封闭对象。


5
您可以通过将数万亿个项目放在上面进行测试,以查看何时崩溃? - Smashery
一个密切相关的问题是Mono下的堆栈大小 - Palec
4个回答

76

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

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


3
ASP.Net应用程序的256 KB大小适用于32位应用程序。在64位的Windows Server 2008及更高版本中,堆栈大小已经提升到了512 KB。有关详细信息,请参阅KB 932909。 - Dono
2
@BrianRasmussen 你实际上可以使用 stackalloc 在栈上分配一个数组。此外,仅因为某个类型是引用类型并不一定意味着它将在堆栈或堆上分配,这取决于CLR的实现,在.NET实现中,它在几种特殊情况下有所不同(类型的大小和作用域)。 - Michael J. Gray
@MichaelJ.Gray 我不知道有哪些实现是引用类型的实例不在托管堆上。您有这方面的例子吗? - Brian Rasmussen
@BrianRasmussen 请查看Eric Lippert的文章《堆栈是实现细节》(http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx)。这是一个思想实验。而且也是一篇很好的阅读材料。 - Cristian Diaconescu
@CristiDiaconescu 谢谢。我知道这篇文章。 - Brian Rasmussen
感谢@BrianRasmussen分享有关PE头的信息。 您能否分享有关更新可执行文件PE头中默认大小的文档? - Kumar

55
你的数组将存储在堆上,栈大小在你的情况下无关紧要。

7
如果您想检查当前.NET程序集的值,可以使用Visual Studio命令提示符中附带的ILDASM命令来实现。启动工具后,打开程序集,然后转到View-> Headers菜单。现在在新打开的Headers窗口中向下滚动到PE Optional Header (32 bit)部分。您将看到两个字段:
  1. 堆栈保留大小 - 这是不言自明的。这是分配给程序/应用程序中任何创建的线程的默认堆栈内存大小。
  2. 堆栈提交大小 - 提交的堆栈空间是(引用来自此处的Hans Passant)

所述空间保留在操作系统的分页文件中,因此当需要时可以始终交换堆栈。

输入图像描述


5

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接