C#中的堆栈容量

49 .net c# clr stack

有人能告诉我C#中的堆栈容量是多少.

我正在尝试使用30,000个项目的数组形成3D网格闭合对象.

Bri*_*sen 71

.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. (3认同)
  • @BrianRasmussen你可以使用`stackalloc`在堆栈上实际分配一个数组.另外,仅仅因为某些东西是引用类型并不一定意味着它将被分配在堆栈或堆上,它会因CLR的实现而异,并且在.NET实现中它会在一些特殊情况下变化(类型和类型的大小)范围). (2认同)

Ant*_*hyy 53

您的数组将存在于堆中,堆栈大小与您的情况无关.


RBT*_*RBT 6

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

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

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

在此处输入图片说明


小智 5

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