2009-04-24 13 views
85

C#でプログラミングしている間に実際にstackallocを使用したことがありますか?私は何が起きているのか分かっていますが、コードに表示される唯一の時間は偶然です。例えば、staticと入力したときにIntellisenseが示唆するためです。`stackalloc`キーワードの実際的な使用

stackallocの使用シナリオには関係ありませんが、私は実際にアプリケーションでかなりの量の古いinteropを実行していますので、今はいつでもunsafeコードを使用することができます。しかし、私は通常、unsafeを完全に避ける方法を見つける。

.netの単一スレッドのスタックサイズは〜1Mbです(私が間違っていれば私を修正します)、私はさらにstackallocを使用することから予約しました。

実際には、「これは正確にデータ量と処理が安全でなくてstackallocを使用するための正確な量ですか」と言うことができますか?

+2

'System.Numbers'がたくさん使っていることに気付いただけですhttps://referencesource.microsoft.com/#mscorlib/system/number.cs,86404b606ba1649f – Slai

答えて

90

stackallocを使用する唯一の理由は、パフォーマンス(計算または相互運用性のいずれか)です。ヒープ割り当て配列の代わりにstackallocを使用することで、GCの負荷を少なくし(GCを少なく実行する必要があります)、配列を固定する必要はなく、ヒープ配列よりも割り当てが速く、自動的に解放されますメソッドの終了(ヒープ割り当て配列は、GCの実行時にのみ割り当て解除されます)。また、ネイティブのアロケータ(mallocや.Netのようなもの)の代わりにstackallocを使うことで、スコープの終了時に速度と自動解放を得ることもできます。

パフォーマンス面では、stackallocを使用すると、データの局所性によりCPUのキャッシュヒット率が大幅に高くなります。

+19

データの局所性、良い点!それは、管理されたメモリが、いくつかの構造や配列を割り当てたいときにはめったに達成できないものです。ありがとう! – Groo

+16

ヒープ割り当ては、トラバースする空きリストがないため、管理対象オブジェクトの方が通常は管理されていない場合よりも高速です。 CLRはヒープポインタをインクリメントします。局所性に関しては、連続的な割り当ては、ヒープ圧縮のために長期間実行される管理対象プロセスのために配置される可能性が高くなります。 –

20

stackallocは、安全でないコードにのみ関連します。マネージコードの場合、データをどこに割り当てるかは決めることができません。値の型は、デフォルトでスタックに割り当てられます(参照型の一部でない場合は、ヒープに割り当てられます)。参照型はヒープに割り当てられます。

プレーンなバニラ.NETアプリケーションのデフォルトのスタックサイズは1 MBですが、これはPEヘッダーで変更できます。スレッドを明示的に開始する場合は、コンストラクタのオーバーロードによって異なるサイズを設定することもできます。 ASP.NETアプリケーションの場合、デフォルトのスタックサイズはわずか256Kです。これは、2つの環境を切り替える場合に注意する必要があります。

+0

Visual Studioからデフォルトのスタックサイズを変更することはできますか? – configurator

+0

@configurator:私の知る限りではありません。 –

27

私は、[near]リアルタイムDSP作業のためにbufferallocを使用してバッファを割り当てました。パフォーマンスができるだけ一貫していなければならない非常に特殊なケースでした。一貫性と全体的なスループットには違いがあることに注意してください。この場合、プログラムのその時点でのガベージコレクションの不確定性だけでは、ヒープ割り当てが遅すぎるという懸念はありませんでした。私は99%のケースでそれを使用しません。

関連する問題