每个新线程或纤程都接收其自己的堆栈空间,同时包含保留和初始提交的内存。 保留内存大小表示虚拟内存中的总堆栈分配。 因此,保留大小限制为虚拟地址范围。 最初提交的页面在被引用之前不会利用物理内存;但是,它们确实会从系统中删除页面,即页面文件的大小加上物理内存的大小。 系统会根据需要在保留的堆栈内存中提交附加页面,直到堆栈达到保留的大小减去一页 (,该页面用作保护页,以防止堆栈溢出) 或系统在内存中内存不足,导致操作失败。

最好选择尽可能少的堆栈大小,并提交线程或纤程正常运行所需的堆栈。 为堆栈保留的每个页面不能用于任何其他目的。

堆栈在其线程退出时被释放。 如果线程由另一个线程终止,则不会释放它。

保留的和初始提交的堆栈内存的默认大小是在可执行文件头中指定的。 如果没有足够的内存来保留或提交请求的字节数,则线程或纤程创建会失败。 链接器使用的默认堆栈预留大小为 1 MB。 若要为所有线程和纤程指定不同的默认堆栈预留大小,请使用模块定义 ( .def) 文件中的 STACKSIZE 语句。 操作系统 (通常为 64 KB) ,将指定的大小向上舍入到系统分配粒度的最接近的倍数。 若要检索当前系统的分配粒度,请使用 GetSystemInfo 函数。

若要更改初始提交的堆栈空间,请使用 CreateThread、 CreateRemoteThread或 CreateFiber函数的 dwStackSize 参数。 此值向上舍入到最接近的页面。 通常,保留大小是在可执行文件头中指定的默认保留大小。 但是,如果 dwStackSize 指定的初始提交大小大于或等于默认预留大小,则预留大小为这一新的提交大小,最大舍入为 1 MB 的最接近倍数。

若要更改保留的堆栈大小,请将 CreateThread或 CreateRemoteThread的 dwCreationFlags 参数设置为 stack _ Size PARAM 为 _ _ _ _ 保留,并使用 dwStackSize 参数。 在这种情况下,最初提交的大小是在可执行文件头中指定的默认大小。 对于纤程,请使用 CreateFiberEx的 dwStackReserveSize 参数。 提交的大小在 dwStackCommitSize 参数中指定。

SetThreadStackGuarantee函数设置与调用线程或纤程关联的堆栈的最小大小,在任何堆栈溢出异常期间都将可用。