.NET堆栈与Windows堆栈

pro*_*eek 7 .net stack

Windows内部本书第5版有360页以下评论.

The stack size for the initial thread is taken from the image—there’s no way 
to specify another size.

据我所知,对于Windows操作系统,每个线程都有4K或16K(取决于系统)堆栈,并且大小是固定的.

那么.NET中的堆栈怎么样?

  • 堆栈有多大?
  • 堆栈的大小是固定的还是可变的?
  • 是否像Windows的情况一样为每个线程分配堆栈?

Han*_*ant 9

是的,启动线程的大小由.EXE文件头中的值确定.必然如此,在程序中的任何代码运行之前,操作系统都会创建线程.它调用程序的入口点CorExeMain().

您使用的托管编译器将该值写入EXE文件头.当您针对x86或任何CPU时,当前.NET编译器选择1 MB,当您定位x64时,选择4 MB.但是,这不是固定的,您可以使用Editbin.exe实用程序/ STACK命令行选项修改该值.您可以使用此post-build事件来获得2MB堆栈:

  set path=%path%;$(DevEnvDir);$(DevEnvDir)..\..\vc\bin
  editbin.exe /STACK:2097152 "$(TargetPath)"
Run Code Online (Sandbox Code Playgroud)

您自己创建的线程的堆栈大小在您的控制之下,Thread类构造函数具有允许您指定大小的重载.如果将值剪切为256 KB,则不能使其太小.这是必要的,即时编译器也使用堆栈.