xDebugでは、関数をネストできる回数が制限されていますが、関数を何度もネストすることの欠点はありますか?
1 に答える
3
はい。
別の関数内から関数を呼び出すたびに、スタックに1つのレベルを追加します。
過去の関数呼び出しはまだ返されていないため、ローカル変数に対して要求されたメモリの割り当てを解除することはできません。スタック全体が解かれるまで、常駐し続けます。
1,000回の呼び出しの深さの関数内から例外をスローするとします。スタックトレースを生成するには、1,000の関数呼び出しを上に移動して、それらすべてを例外オブジェクトに入れる必要があります。
適切に記述されたループでは代わりに実行できなかったような深い再帰で実行できることは何もありません。ループは両方ともメモリ効率が高くなります(関数呼び出しごとにスタックフレームのオーバーヘッドが必要ないため)。 )そして時間効率が良い(削除した関数呼び出しを実際に実行するオーバーヘッドがないため)。
再帰レベル1,000に達するプログラムが、意図したとおりに動作している可能性はほとんどありません。多くの場合、それは無限の再帰で立ち往生し、最終的にはシステムのすべてのRAMを使い果たします。早く殺したほうがいい。
于 2013-01-14T18:01:05.583 に答える