シングルトンメソッドの1つを同時に複数回呼び出すと、シングルトンクラスがあり、このメソッドにはローカル変数があります。シングルトンの各メソッド呼び出しは独自のプライベート スタックを取得しますか?呼び出し間でローカル変数データを共有/混合することについて心配する必要はありますか?
4 に答える
クラス メソッドでローカル変数を使用すること (シングルトンかどうかは重要ではありません) は、通常の関数でローカル変数を使用することと同じです。ローカル変数は混同されません。
再帰について話しているのか、複数のスレッド呼び出しについて話しているのかわからないので、再帰を意味していると思います。
メソッドを呼び出すたびに、静的と宣言されていないローカル変数がスタックに割り当てられます。これが機能する方法は、各呼び出しが独自のスタック「フレーム」を持つことです。呼び出しが終了すると、スタック フレームが解放されます (そして、すべてのローカル変数が破棄されます)。
したがって、関数 foo() が呼び出されると、そのローカル変数はスタック上のフレームにあり、それをフレーム A と呼びましょう。foo が自分自身を呼び出す場合、別のフレームが追加されます。それを B と呼びましょう。 A と B は存在しますが、A は本質的に休止状態です (通常、A のデータはポインターなどを介して間接的に変更できます)。2 番目のコールが終了すると、B フレームが解放され、A フレームが再びアクティブになります。最後に、トップ コールが終了すると、A フレームが消えます。
スタック スペースは限られているため、スタックが保持できる以上のフレームを作成しないように注意する必要があります。その場合、スタックは「オーバーフロー」と呼ばれます。
いいえ、心配する必要はありません。用語を修正するには、「シングルトンの各メソッド呼び出しは独自のプライベートスタックを取得しますか」-独自のスタックではなく、各メソッド呼び出しが独自のスタックフレームを取得するので問題ありません。
シングルトン メソッドは、通常の関数 (C++) とまったく同じです。ローカル変数も同じように考えてください。
これは、メソッド呼び出し間で明確に共有される静的ローカル変数には適用されないことに注意してください。
各メソッドは独自のプライベート スタックを取得します。共有に注意する唯一の可能性は、クラス内の静的変数です....しかし、urクラスは、urクラスのインスタンス変数にも適用されるシングルトンであるためです。メソッドのローカル変数は常にスタック内にあるので、気にする必要はありません。