显然,mac os x 的堆栈大小有一个硬性限制,取自http://lists.apple.com/archives/scitech/2004/Oct/msg00124.html ,这已经很老了,我不确定它是否仍然如此,但要设置它只需调用 ulimit -s hard,它的 65532。或大约 65 兆。
我在雪豹上做了一些测试,10.6.8,它似乎是真的。
$ ulimit -a
...
stack size (kbytes, -s) 8192
...
$ ulimit -s 65533
-bash: ulimit: stack size: cannot modify limit: Operation not permitted
$ ulimit -s 65532
$
我还发现了这个http://linuxtoosx.blogspot.com/2010/10/stack-overflow-increasing-stack-limit.html虽然我没有测试过,所以不能说太多。
当应用程序消耗通常从堆中获取的大量内存时,堆栈通常是为本地自动变量保留的,这些变量存在的时间相对较短,相当于函数调用的生命周期,堆是大多数持久数据所在的地方.
这是一个快速教程:
#include <stdlib.h>
#define NUMBER_OF_BYTES 10000000 // about 10 megs
void test()
{
char stack_data[NUMBER_OF_BYTES]; // allocating on the stack.
char *heap_data = malloc(NUMBER_OF_BYTES); // pointer (heap_data) lives on the stack, the actual data lives on the heap.
}
int main()
{
test();
// at this point stack_data[NUMBER_OF_BYTES] and *heap_data have being removed, but malloc(NUMBER_OF_BYTES) persists.
// depending on the calling convention either main or test are responssible for resetting the stack.
// on most compilers including gcc, the caller (main) is responssible.
return 0;
}
$ ulimit -a
...
stack size (kbytes, -s) 8192
...
$ gcc m.c
$ ./a.out
Segmentation fault
$ ulimit -s hard
$ ./a.out
$
ulimit 只是暂时的,您每次都必须更新它,或者更新相应的 bash 脚本以自动设置它。
一旦设置了 ulimit,它就只能降低而不能提高。