2016-07-09 6 views
0

In c#Stack/Heapでのメモリ割り当てはいつ行われるのですか?実行時またはコンパイル時に実行されます。私の研究から、すべてのメモリ割り当ては、実行時に値型と参照型の両方で発生することを理解しています。これは正しいです?c#Stack/Heapでのメモリ割り当てが発生する

+1

はい、メモリの割り当てはコンパイル時には実行できません。プログラムが実行されているときだけ、そのプログラムがメモリにロードする全てのオブジェクト( 'struct'または' class')が必要です。 – EvilTak

+1

それは正しい...... – zerkms

+1

スタック上の割り当てはコンパイル時に起こると主張する人もいます。次に、実際にスタックポインタを変更する命令を実行時に実行する必要があります。これは愚かな質問のようなものです。おそらく、あなたは[スタックとヒープが何であるか]を読むべきです(http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap)。 –

答えて

1

コンパイル時にどうなりますか?プログラムはまだ実行されておらず、プログラムを実行する前にメモリを割り当てる必要はありません。これは実行時に発生する必要があります(実際に生成されたILを実行する場合)。

メモリ管理では、変数の作成時だけでなく、初めて変数を使用するときには発生しないように最適化されています。

0

実際の割り当ては混乱している可能性があります。実際の割り当ては、プログラムが実際に実行されているときに実行時にのみ実行され、割り当ての計算/決定が行われます。たとえば、次のような方法を考えてみます。

void Foo() 
{ 
    int i = 42; 
    Console.WriteLine(i); 
} 

コンパイラ今静的(コンパイル時に)しますiは、スタック上のスペースの4つのバイトを必要とするであろうこと。ただし、プログラムが実際に実行されてから実際の割り当てが行われるまでは、そのプログラムは実行されません。

さらに、CLRがコードを読み込んでJIT(Just in Timeコンパイラ)に渡すまで、上記のメソッドはマシンコード(割り当てなどの操作の前提条件)にコンパイルされません。もちろん、実際のプロセスが作成されるまでは、たとえそれが実行されても、OSがメモリアドレス空間を割り当てても使用することはできません。

関連する問題