我正在使用MinGW和GCC 3.4.5(mingw-special vista r3).
我的C应用程序使用了大量的堆栈,所以我想知道是否有任何方法可以以编程方式告诉剩余多少堆栈,因此如果我发现我即将耗尽,我可以干净地处理这种情况.
如果没有其他方法可以解决可能耗尽堆栈空间的问题?
我不知道我将从哪个堆栈大小开始,因此需要以编程方式识别.
getrusage函数可以获得当前的用法.(见man getrusage
).
在getrlimit
Linux中,将有助于获取与堆栈大小RLIMIT_STACK
参数.
#includeint main (void) { struct rlimit limit; getrlimit (RLIMIT_STACK, &limit); printf ("\nStack Limit = %ld and %ld max\n", limit.rlim_cur, limit.rlim_max); }
请看一下man getrlimit
.同样的信息可以通过以下方式获取ulimit -s
或ulimit -a
堆栈大小排.还要看一下setrlimit
可以设置限制的功能.但正如在其他答案中提到的,如果你需要调整堆栈,那么你可能应该重新考虑你的设计.如果你想要一个大数组,为什么不从堆中获取内存?
将局部变量的地址从堆栈中取出将起作用.然后在更嵌套的调用中,您可以减去另一个本地的地址以找到它们之间的差异
size_t top_of_stack; void Main() { int x=0; top_of_stack = (size_t) &x; do_something_very_recursive(....) } size_t SizeOfStack() { int x=0; return top_of_stack - (size_t) &x; }
如果你的代码是多线程的,那么你需要处理每个线程存储top_of_stack变量.
检查你的编译器是否支持stackavail()
Raymond Chen(The Old New Thing)对这类问题有一个很好的答案:
如果你不得不问,你可能做错了什么.
这里是关于堆栈分配的一些Win32细节:MSDN.
如果您认为可能受到堆栈空间的限制,您几乎肯定会受到可用虚拟内存的限制,在这种情况下,您需要找到不同的解决方案.
你究竟想做什么?