どうやらmac os x のスタック サイズにはハード リミットがあるようです。今でも当てはまりますが、設定するには ulimit -s hard を呼び出すだけです。その 65532. または約 65 MB です。
Snow Leopard 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 が設定されると、下げることはできますが、上げることはできません。