2012-02-28 54 views
0

在使用带有2GB RAM的Visual C++的Windows XP上,需要在堆栈上同时创建一个stackoverflow的函数有多少? (即在递归函数中)创建一个stackoverflow有多少个函数?

是否有一种简单的方法可以计算出其他类似情况?

+0

该堆栈默认为兆字节。经过优化的版本中可能的最小堆栈帧为4个字节。实际的更大。 RAM与它无关。 – 2012-02-28 02:26:47

+1

我只能在一个函数调用中溢出堆栈。 – mah 2012-02-28 03:03:17

回答

3

仅凭编译器无法知道。堆栈溢出是由于溢出堆栈而发生的。堆栈的大小取决于函数使用的参数,函数使用的局部变量以及编译器优化。我相信甚至有一些C99函数会直接从堆栈中分配空间。

堆栈大小的限制是由编译器开关决定的,而不是您计算机中有多少RAM。因此,溢出需要多少次调用与编译器设置有关,而不是内存。

这不是你可以确定的先验。至少,并不平凡。

+1

实际上,通过查看PE可选标题(偏移72)中的SizeOfStackCommit字段,可以确定运行时的图像堆栈限制。正如汉斯所说,它通常是0x10000(1MB)。 – 2012-02-28 05:08:25

0

您可以尝试一个无限递归..这是堆栈溢出的常见原因之一。

int f() { g(); } int g() { f(); }

+0

这并不回答这个问题。 - 另外,我预料它会在不到5秒的时间内产生堆栈溢出,但它会超时:http://ideone.com/QoWtS;) – visitor 2012-02-28 09:07:41