0

関数がスタックに置かれるのはいつですか?

同様に、それらがコンパイルされると、各関数がスタックに置かれ、オブジェクトがそれを呼び出すと、スタック上のその関数に移動しますか?

また

最初にメイン関数がスタックにロードされ、次にオブジェクトがヒープに割り当てられ、次にオブジェクトが関数を呼び出すとスタックに置かれ、スタック上のローカル変数にメモリが割り当てられるたびに?

通常の関数と同様に、静的メソッドも同じ手順に従います。メモリが一度だけ割り当てられると聞いたからです。

プログラムの図式表現のどれが正しいかを特定するのを手伝ってください...

ここに画像の説明を入力

ここに画像の説明を入力

4

3 に答える 3

3

関数はスタックに置かれません。呼び出しスタックには呼び出しフレームが含まれており、関数が呼び出されると、新しい呼び出しフレームがプッシュされます。関数が戻るときにポップされます。

通常、呼び出しフレームには、通常Java バイトコードとして表される [calling] 関数のコード (つまり、戻りアドレス) への参照またはポインターも含まれます。

これは非常に一般的なシナリオですが、普遍的なシナリオではありません。古い A.Appel のCompiling with Continuationsの本 (スタックのない SML/NJ 実装について説明しています) を参照してください。

于 2013-10-02T07:07:50.663 に答える
1

関数がスタックに置かれるのはいつですか?

スタックには関数ではなくデータが含まれます。関数は再帰的に呼び出すことができるため、またはまったく呼び出すことができないため、関数にスペースを事前に割り当てることは意味がありません。

それらがコンパイルされると、各関数はスタックに置かれます。

これどこで読んだ?

そして、オブジェクトがそれを呼び出すと、

スレッドは、オブジェクトではなくコードを実行します。

スタック上のその関数に移動しますか?

それのようなものはありません。

最初に main 関数が stack にロードされ、

関数はスタックにロードされません。

オブジェクトは heap に割り当てられ、

おそらく、エスケープ解析を使用してスタックに割り当てることができます。

オブジェクトが関数を呼び出すと、オブジェクトはスタックに置かれます。

スレッドはメソッドを呼び出し、メソッドが呼び出されると、オプションでスタック フレームを割り当てることができます。そのスタック フレームには、ローカル変数とスタック割り当てオブジェクトを含めることができます。

スタック上のローカル変数にメモリを割り当てるたびに?

各メソッド呼び出しは、メモリを使用するすべてのローカル変数に対して単一のメモリ ブロックを割り当てることができます。注: 一部のローカル変数はレジスタに割り当てることができ、スタックを使用しない場合があります。

静的メソッドも同じ手順に従います。

非静的メソッドにはインスタンスの開始時に追加の引数があることを除いて、静的メソッドと非静的メソッドの間に実際の違いはありません。

通常の関数と同様に、メモリが一度だけ割り当てられると聞いたことがあります。

メソッドは呼び出しごとに 1 回だけ割り当てます。内部にローカル変数を含むループがあるとしますが、それでも一度しか割り当てられません。

于 2013-10-02T08:12:09.860 に答える