【发布时间】:2013-08-31 06:56:51
【问题描述】:
如何计算我的程序在 UNIX 中所需的最小堆栈大小,以使我的程序永远不会崩溃。
假设我的程序是
int main()
{
int number;
number++;
return 0;
}
1) 运行此程序所需的堆栈大小是多少?是怎么计算的?
2) 我的 Unix 系统给出了ulimit -s 512000。我的小程序真的需要这个值512MB吗?
3) 如果我有一个包含多线程、大约 500 个函数(包括一些库、宏、动态分配的内存等)的大型程序怎么办。为此需要多少堆栈大小?
【问题讨论】:
-
由于你的程序不做任何事情,它真的根本不需要任何堆栈...
-
@CodeCodeCode 您没有在硬盘中创建整数大小的内存,堆栈在 RAM 中而不是在硬盘上。是的,你的程序什么也没做,因为编译器已经优化了它。使用 godbolt 查看代码的 ASM 翻译。
-
@KerrekSB 必须调用函数
main,并且必须在堆栈上为number分配空间。在实践中,甚至在输入main之前使用数百字节的堆栈并不罕见。 (我不知道目前的做法,但我过去使用过在调用main之前将整个环境放在堆栈上的系统。) -
@CodeCodeCode 这是permalink。
-
这是一个有效的问题。有时了解使用了多少堆栈空间很重要,例如在为堆栈有限的内核编写代码或编写复杂的递归算法时。编译器应该通过提供在例程或块中使用的量来帮助计算堆栈空间(没有 VLA 等),并且链接器应该提供非递归调用树的总数。
标签: c++ c multithreading unix