stackalloc
キーワードはどのような機能を提供しますか?いつ、なぜそれを使いたいのですか?
7 に答える
MSDNから:
アンセーフ コード コンテキストで使用され、スタックにメモリ ブロックを割り当てます。
malloc
C# の主な機能の 1 つは、通常は C/C++ でまたはを使用してメモリに直接アクセスする必要がないことですnew
。ただし、実際にメモリを明示的に割り当てたい場合は可能ですが、C# はこれを「安全ではない」と見なすため、unsafe
設定でコンパイルする場合にのみ行うことができます。stackalloc
そのようなメモリを割り当てることができます。
ほとんどの場合、マネージ コードを記述するためにこれを使用する必要はありません。場合によっては、メモリに直接アクセスすると、より高速なコードを記述できる可能性があります。基本的に、いくつかの問題に適したポインター操作を使用できます。特定の問題があり、安全でないコードが唯一の解決策でない限り、おそらくこれは必要ありません。
Stackalloc はスタックにデータを割り当てます。これは、メソッド内で値型の配列を繰り返し作成および破棄することによって生成されるガベージを回避するために使用できます。
public unsafe void DoSomeStuff()
{
byte* unmanaged = stackalloc byte[100];
byte[] managed = new byte[100];
//Do stuff with the arrays
//When this method exits, the unmanaged array gets immediately destroyed.
//The managed array no longer has any handles to it, so it will get
//cleaned up the next time the garbage collector runs.
//In the mean-time, it is still consuming memory and adding to the list of crap
//the garbage collector needs to keep track of. If you're doing XNA dev on the
//Xbox 360, this can be especially bad.
}
ポール、
ここにいる誰もが言っているように、そのキーワードはランタイムに、ヒープではなくスタックに割り当てるように指示します。これが何を意味するのかに興味がある場合は、この記事をご覧ください。
http://msdn.microsoft.com/en-us/library/cx9s2sy4.aspx
このキーワードは、安全でないメモリ操作を処理するために使用されます。これを使用することで、ポインターを使用できるようになります (C/C++ の強力で面倒な機能)。
stackalloc
スタックにメモリを割り当てるように .net ランタイムに指示します。
スティーブが指摘したように、安全でないコードのコンテキストでのみ使用されます (たとえば、ポインターを使用する場合)。
C# アプリケーションで安全でないコードを使用しない場合、これは必要ありません。