我正在开发一个倾向于使用大量堆栈内存的程序。有没有办法找出堆栈上的剩余空间?这是在linux平台上的。
谢谢!!
有没有办法找出堆栈上的剩余空间
是的,有:对于主线程,您可以简单地&argc
在 main 中记录一些全局(例如int *g_addr_argc
),然后调用getrlimit(RLIMIT_STACK, ...)
并比较一些本地的地址,例如
char a_local;
struct rlimit rlim_stack;
if (getrlimit(RLIMIT_STACK, &rlim_stack) == 0 &&
rlim_stack.rlim_cur != RLIM_INFINITY &&
(uintptr_t)g_addr_argc - (uintptr_t)&a_local > rlim_stack.rlim_cur - 8192) {
fprintf(stderr, "Danger: getting too close to the stack limit\n");
}
这仅适用于主线程。如果您的应用程序是多线程的,您可以使用它pthread_getattr_np
来查找有关当前线程堆栈的信息。
您可以在代码中自己设置堆栈大小,使用setrlimit
. 然后你不必怀疑,你可以在你认为合适的时候增加它(在合理的范围内)。
#include <sys/resource.h>
int main (int argc, char **argv)
{
const rlim_t kStackSize = 16 * 1024 * 1024; // min stack size = 16 MB
struct rlimit rl;
int result;
result = getrlimit(RLIMIT_STACK, &rl);
if (result == 0)
{
if (rl.rlim_cur < kStackSize)
{
rl.rlim_cur = kStackSize;
result = setrlimit(RLIMIT_STACK, &rl);
if (result != 0)
{
fprintf(stderr, "setrlimit returned result = %d\n", result);
}
}
}
// ...
return 0;
}