Unixでは、リソースの状態を取得する機能があります(getrusage
)。それはMac OS Xでもありますが、動作しません。 Cocoa(Carbonについてはわかりません)に事前実装されたAPIがありますが、C APIのみで実装する必要があります。Mac OS X上のC API経由で現在のスレッドのスタックサイズを取得するには? (ココアや炭素はありません)
これと同等のC APIは何ですか?
Unixでは、リソースの状態を取得する機能があります(getrusage
)。それはMac OS Xでもありますが、動作しません。 Cocoa(Carbonについてはわかりません)に事前実装されたAPIがありますが、C APIのみで実装する必要があります。Mac OS X上のC API経由で現在のスレッドのスタックサイズを取得するには? (ココアや炭素はありません)
これと同等のC APIは何ですか?
あなたはこのpthread_attr_t
オブジェクトを初期化し、その上にpthread_attr_getstacksize
を呼び出すことにより、スレッドを作成する前に行う必要があります。現在のスレッドが既定の属性で作成されていることが分かっている場合は、後でテストを延期する可能性がありますが、悪い考えのように思えます。
これで、デフォルトのテストはむしろ役に立たないと思います。大きなスタックが必要な場合は、スレッドを作成する前に大きなスタックサイズを明示的に設定してください。小さなスタックだけが必要な場合は、明示的に設定してメモリ節約をお楽しみください。ライブラリ関数や再帰(この場合4kはおそらく良い)を使わないことを知っていないかぎり、深い再帰を行うつもりがない限り、256kを超えることはできません。再帰のための安全なスタックサイズを得るために使用するおおよその推定値は次のとおりです。
levels_of_recursion * (128 + total_size_of_locals) + (using_lib ? 32768 : 4096)
128はどこから来ますか? – Gabe
コールフレームの追加オーバーヘッドの量に対する安全な上限。現実には、おそらくあなたが地元の人の大きさで引数を数える限り、16-32のようなものでしょうが、コンパイラが一時的に多くの複雑な式を持っていると、もっと大きくなる可能性があります。 –