-2

以下のコードを想定します。

Class test
{
   void foo()
   {
      int i=0;
   }
}

Test t=new Test();
// if many threads call t.foo();

各スレッドには、fooを呼び出すための独自のメモリがありますか?それは、各スレッドが独自のものを持っていることを意味しますiか?

Java / C#は、関数を呼び出すときにどのようにメモリを割り当てますか?私が覚えているように、C#では、各スレッドに1Mのメモリが割り当てられます。Javaはどうですか?

4

2 に答える 2

0

シングル スレッド アプリケーションとマルチスレッド アプリケーションの間でメモリ割り当てに本質的な違いはありません (少なくとも .Net/Windows の世界では)。

ヒープ (通常のオブジェクト) またはスタック (ローカル変数/ローカル構造体/関数パラメーター用) に割り当てられたメモリ。C# アプリケーション (およびほとんどの Windows アプリケーション) のデフォルトのスタック サイズはスレッドあたり 1Mb ですが、ヒープはすべてのスレッド間で共有されます。

于 2013-03-15T04:13:16.410 に答える
0

C#について説明したシナリオで何が起こるか(Javaについてはわかりませんが、同様に動作すると思います)、値 i が短期ストレージに保存されることです(JITが何をしたいかによってスタックまたはレジスタ) . 値型だからです。参照型の場合は、ヒープに移動する可能性が高くなります。

関数が呼び出されるたびに (スレッドに関係なく)、関数は変数 i の新しいインスタンスを取得します。したがって、どのスレッド、またはいくつのスレッドであるかは問題ではなく、関数への呼び出しがいくつ行われるかだけです。

注意すべきことの 1 つは、何かが割り当てられる場所を常に保証できるわけではなく、ほとんどの場合、気にする必要がないということです。JIT/CLR は、イベントのシングル スレッド ビューとプログラムの機能に影響を与えない限り、必要なことは何でも実行できます (特殊なケースもありますが、コードの 99% では、このステートメントは正しいです)。

理解を深めるために、この質問に対する Eric Lippert の回答 ( Fields of class, are they stored in the stack or heap? ) と彼のブログ ( http://blogs.msdn.com/b/ericlippert/ )を読むこともできます。および ( http://ericlippert.com/ ) 彼はこれについて何度も詳しく説明しています。

于 2013-03-15T04:34:27.657 に答える