2011-11-21 3 views
11

私は最近、小さな構造体の配列についてList<>[]の大まかな性能測定を行った。 System.Arrayが手を下ろしているように見えたので、私はそれに行きました。System.Arrayは値型でボクシングを実行しますか?

System.Arrayにはオブジェクト型が含まれているだけなので、確かにそれを構造体で埋めるとボクシングが発生しますか?

しかし、the MSDN entry for System.Array状態:.NET Frameworkバージョン2.0で

、Arrayクラスは System.Collections.Generic.IList<T>System.Collections.Generic.ICollection<T>を実装し、 System.Collections.Generic.IEnumerable<T>ジェネリックインターフェイス。 の実装は、実行時に配列に提供されるため、文書作成ツールには表示されません。 です。その結果、 インターフェイスは、配列 クラスの宣言構文には表示されず、 は汎用インターフェイスタイプ (明示的なインターフェイス実装)に配列をキャストすることによってのみアクセスできるインターフェイスメンバの参照トピックはありません。 。

結局ボクシングが起こらないということですか? (そして、私のパフォーマンスの結果を説明します)

+0

パフォーマンスの結果を説明するには、パフォーマンスを測定するために使用したコードが必要です。 – Snowbear

答えて

12

インデクサー表記を使用している場合は、アレイを使用していません。例:

new int[2]; 
x=[1]=3; 

は、インデクサを使用していない(と私は本当にない行うことができます言語については、以下のIL(彼らは、コードの他のいくつかのスニペットから来るよう行番号が無関係であることに注意してください)

IL_0011: ldc.i4.2 
IL_0012: newarr System.Int32 
IL_0017: stfld Int32[] x 
IL_001c: ldarg.0 
IL_001d: ldfld Int32[] x 
IL_0022: ldc.i4.1 
IL_0023: ldc.i4.3 
IL_0024: stelem.i4 

にコンパイルそれらが存在するかどうかを知る)2つの他のメソッドが配列のコンパイル時に作成されます。

これは、これらのパブリックメソッドを作成します::

public int Get(int index) 
public void Set(int index,int value) 

これらの方法は、いずれかのボックスではないとC#では正常にアクセスすることはできませんありません。 (彼らが公的な方法である理由を私に聞かないでください)。 ILを使用して、またはそれらに代理人を作成して、それらを実行することができます。これらのメソッドを呼び出すためにcallvirtを余儀なくされると、それらは遅くなります。

stelem。*およびldelem。*ファミリは、強く型付けされた配列型への格納を処理するために使用されます。一般的にジェネリックを使用する場合、T[]を使用する場合、次の接頭辞はconstrainedまたはreadonlyです。 stelem.*タイプは通常タイプをチェックしません。例えば。 stelem.i4を使用すると、の接頭辞を使用した場合よりも速くなります。接頭辞にはreadonlyという接頭辞を付けないと、タイプチェックが強制されるためです。

これで、型チェックでは、型が共存していないので完全に無意味です。

ランタイムはゼロ(SZ_arrayまたはベクトル型とも呼ばれます)型から始まる1次元配列を生成するため、ネイティブに認識されます。

は彼らのために、ILのオペコードの家族があります:newarrstelem.*ldelem.*ldlenなど

List<T>タイプはBCLのマイクロソフト実装でそのバッキングストア用のT[]を使用しています。 List<T>は箱ではありません。リストや配列を使用するかどうかに関わらず、配列に物事を格納しています。

+1

配列のヒープ/スタックの割り当てに関するヒント/スタックの割り当てに関する補足的なリンクです:http://stackoverflow.com/questions/1113819/arrays-heap-and-stack-and-value-types/1114152#1114152 – BoltClock

+1

配列は参照型なので、ボックス化されていないintも管理されたヒープに格納されます。箱は何もありません。 – Alex