2015-09-17 8 views

答えて

5

これは、参照型である配列項目を設定するときのパフォーマンスの問題を回避するための一般的なトリックです。配列はCLR(およびJVM)のバリアントです。 object[]stringを書くことができます。これには、実際に文字列をSomethingElse[]に格納していないというランタイムチェックが必要です。その値タイプのトリックでは、実行時にそのチェックを実行する必要はありません。

+0

しかし、そこにある 'ObjectPool'は配列に要素を設定しません。構造体の配列はゼロのstructインスタンスで初期化されているという事実に依存しています。 –

+0

さて、*何かが 'Value'を設定しようとしています。何もその価値を設定していない場合、何がポイントですか?そのコードはここでは表示されていません。 – usr

+0

はい一部のコードでは、フィールド 'Value'が設定されています。しかし、配列内の要素を上書きするものはありません。 'Value'がフィールドであるとすれば、実行時に型チェックはありません。それはあなたの答えを無効にします。ではない? –

1

パフォーマンス上の理由からだと思います。構造体の配列は、クラスの配列ではなく、ガベージコレクタのフレンドです。クラスのインスタンスの配列で5 Tips and Techniques for Avoiding Automatic GC Collections

から

、GCは の各項目をチェックする必要があり、それは、ライブオブジェクトであるかどうかを確認するためにその配列(同じことは、 ジェネリックコレクションのために真であります内部配列を使用します)。 構造体の配列では、構造体がnullになることができないため、GCは配列 オブジェクトがまだライブであるかどうかを調べるだけです(これは でも当てはまります)nullity )。それは、コレクションが実行されたときにGCが調べる必要のないアイテムのうち、数千から数百万である可能性があります。 !

+0

それが本当であれば、CLRは常にすべての配列要素をラップし、GCにする必要はありません...構造体の配列でさえ、参照を保持していれば横断されなければなりません。 – usr

+0

@usrどこから来ているのか分かります。私が最初に記事を読んだとき、私は懐疑的でした。おそらく著者は、参照を含まない構造体の配列を意味するだけであることを意味します。詳細については、著者にお問い合わせください。 –

+0

タイプ自体に参照が含まれていない場合、GCは値タイプの配列をスキップできます。さもなければ、それはまだアレイを通過しなければならない。 –