C# コンパイラがヒープではなくスタックに配列を配置することを決定する場合があることを示唆するブログ エントリを見つけました。
スタック割り当てによるパフォーマンスの向上 (.NET メモリ管理: パート 2)
この男は次のように主張しています。
コンパイラは、独自にスタックに置くことを決定することもあります。私は TestStruct2 で実験を行い、安全でないコンテキストと通常のコンテキストの両方を割り当てました。unsafe コンテキストでは配列はヒープに配置されましたが、通常のコンテキストではメモリを調べたところ、配列は実際にはスタックに割り当てられていました。
誰かがそれを確認できますか?
私は彼の例を繰り返そうとしましたが、試行するたびに配列がヒープに割り当てられました。
C#コンパイラが「unsafe」キーワードを使用せずにそのようなトリックを実行できる場合、私は特に興味があります。多くの小さなバイト配列 (長さ 8 ~ 10 バイト) で動作するコードがあるため、新しいバイトごとに [...] ヒープを使用すると、時間とメモリが無駄になります (特に、ヒープ上の各オブジェクトには 8 バイトのオーバーヘッドがあります)。ガベージ コレクターに必要)。
編集:なぜそれが私にとって重要なのかを説明したいだけです
..netコードを動作させることができるGemalto.NETスマートカードと通信するライブラリを書いています. 何かを返すメソッドを呼び出すと、スマート カードは戻り値の正確なタイプを説明する 8 バイトを返します。この 8 バイトは、md5 ハッシュといくつかのバイト配列連結を使用して計算されます。
問題は、私が知らない配列がある場合、アプリケーションにロードされたすべてのアセンブリのすべての型をスキャンし、同じ配列が見つかるまでそれぞれの 8 バイトを計算する必要があることです。
型を見つける他の方法がわからないので、できるだけ高速化しようとしています。