线程中的堆栈大小在C中定义了什么?

前端之家收集整理的这篇文章主要介绍了线程中的堆栈大小在C中定义了什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在源代码中使用C和 Windows.h.我在 MSDN中阅读了CreateThread API,但我仍然不明白指定堆栈大小的本质.默认情况下,它是1 MB.但如果我指定32个字节会发生什么?

线程中的堆栈大小定义了什么?

请提供详尽的解释,我将不胜感激.谢谢.

解决方法

堆栈用于存储局部变量,在函数调用中传递参数,存储返回地址.线程的堆栈具有固定大小,该大小在创建线程时确定.这也是你所指的价值.

在创建线程时确定堆栈大小,因为它需要占用连续的地址空间.这意味着必须在创建线程时保留线程堆栈的整个地址空间.

如果堆栈太小,那么它可能会溢出.这是一个称为堆栈溢出的错误情况,本网站以此命名.当您调用某个函数时,会发生以下部分或全部:

>参数被压入堆栈.
>返回地址被压入堆栈.
>创建包含函数局部变量空间的堆栈帧.

所有这些都消耗了堆栈中的空间.当函数依次调用另一个函数时,会消耗更多的堆栈空间.随着调用堆栈的深入,需要更多的堆栈空间.

因此,将堆栈尺寸设置得过低的后果是,您可以耗尽堆栈并使其溢出.这是您无法恢复的终端条件.当然,32个字节(向上舍入到一个页面,即4096个字节)对于几乎所有线程来说都太小了.

如果你有一个包含大量线程的程序,并且你知道线程不需要保留1MB的堆栈大小,那么使用较小的堆栈大小会有好处.这样做可以避免耗尽可用的进程地址空间.

另一方面,您可能有一个程序,其中一个线程具有深度调用堆栈,这会占用大量的堆栈空间.在这种情况下,您可能会保留超过默认的1MB.

但是,除非你有充分的理由不这样做,否则最好坚持使用默认的堆栈大小.

原文链接:https://www.f2er.com/c/117565.html

猜你在找的C&C++相关文章