【发布时间】:2010-10-23 20:23:20
【问题描述】:
谁能告诉我 C# 中的堆栈容量是多少。
我正在尝试使用包含 30,000 个项目的数组来形成一个 3D 网格封闭对象。
【问题讨论】:
-
你可以自己测试一下,在上面放上万亿个项目,看看它什么时候崩溃?
-
一个密切相关的问题是Stack size under Mono。
谁能告诉我 C# 中的堆栈容量是多少。
我正在尝试使用包含 30,000 个项目的数组来形成一个 3D 网格封闭对象。
【问题讨论】:
.NET 应用程序的默认堆栈大小为 1 MB(32 位 ASP.NET 应用程序的默认堆栈大小为 256 KB,64 位 ASP.NET 应用程序的默认堆栈大小为 512 KB),但您可以更改它。对于应用程序,您可以通过修改可执行文件的 PE 标头来更改默认大小。对于您创建的线程,您可以使用采用堆栈大小的构造函数重载。
但正如 Anton Tyjhyy 在他的回答中指出的那样,数组是引用类型,因此位于堆上(即使数组恰好包含一堆值类型)。
【讨论】:
stackalloc 在堆栈上分配一个数组。此外,仅仅因为某些东西是引用类型并不一定意味着它将在堆栈或堆上分配,它因 CLR 的实现而异,在 .NET 实现中,它在一些特殊情况下(类型的大小和范围)。
您的数组将位于堆上,堆栈大小与您的情况无关。
【讨论】:
要使用堆栈来存储数组,您必须使用带有指针和 stackalloc 的不安全代码来在堆栈上分配所需的内存空间。
【讨论】:
如果要检查当前 .NET 程序集的值,可以使用 Visual Studio 命令提示符附带的 ILDASM 命令来完成。启动该工具后,打开程序集,然后转到 View -> Headers 菜单。现在向下滚动到新打开的Headers 窗口中的PE Optional Header (32 bit) 部分。您将看到两个字段:
上述空间保留在操作系统的页面文件中,所以 必要时可以随时换出堆栈。
【讨论】: