当前位置:  开发笔记 > 编程语言 > 正文

用C检查可用的堆栈大小

如何解决《用C检查可用的堆栈大小》经验,为你挑选了4个好方法。

我正在使用MinGW和GCC 3.4.5(mingw-special vista r3).

我的C应用程序使用了大量的堆栈,所以我想知道是否有任何方法可以以编程方式告诉剩余多少堆栈,因此如果我发现我即将耗尽,我可以干净地处理这种情况.

如果没有其他方法可以解决可能耗尽堆栈空间的问题?

我不知道我将从哪个堆栈大小开始,因此需要以编程方式识别.



1> phoxis..:

getrusage函数可以获得当前的用法.(见man getrusage).

getrlimitLinux中,将有助于获取与堆栈大小RLIMIT_STACK参数.

#include 
int 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 -sulimit -a堆栈大小排.还要看一下setrlimit可以设置限制的功能.但正如在其他答案中提到的,如果你需要调整堆栈,那么你可能应该重新考虑你的设计.如果你想要一个大数组,为什么不从堆中获取内存?


`getrusage()`对Linux上的堆栈大小不起作用."`ru_isrss(unmaintained)这个字段目前在Linux上尚未使用."(http://linux.die.net/man/2/getrusage).我不知道什么时候会这样,但内核2.6.28也是如此.

2> Rob Walker..:

将局部变量的地址从堆栈中取出将起作用.然后在更嵌套的调用中,您可以减去另一个本地的地址以找到它们之间的差异

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变量.


特别是在MinGW上这可能没问题.通常,程序的堆栈不保证是连续的.实现(例如,没有虚拟内存的实现)根据需要分配堆栈块并将它们链接在一起是合法的.当然,如果你的平台做到了这一点,那么程序甚至可能没有默认的最大堆栈大小:你可以继续运行直到你的可用内存耗尽.但无论如何都有一个限制的一个很好的理由是防止失控的递归通过耗尽内存来取消整个系统.

3> dmityugov..:

检查你的编译器是否支持stackavail()



4> Skizz..:

Raymond Chen(The Old New Thing)对这类问题有一个很好的答案:

如果你不得不问,你可能做错了什么.

这里是关于堆栈分配的一些Win32细节:MSDN.

如果您认为可能受到堆栈空间的限制,您几乎肯定会受到可用虚拟内存的限制,在这种情况下,您需要找到不同的解决方案.

你究竟想做什么?


虽然如果你曾尝试编写真正的,真正可移植的代码,你会发现"你总是要问,而且你总是做错了,因为没有"堆栈使用"的可移植概念,但它是程序员的责任不要使用太多堆栈.所以最好只加入沉默的阴谋,编写一个功能测试,你希望在实践中消耗尽可能多的堆栈,并留给平台集成商担心".
问题不是"我应该检查堆栈大小吗?" 它是"如何检查堆栈大小?"
推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有