2011-01-13 3 views

答えて

14

32ビットCLRの場合、両方ともロック用に4バイト、タイプハンドル用に4バイト、および2つのint用に8バイトを持ちます。ただし、配列には長さ(この場合は2)を格納するための余分な4バイトがあるため、配列のオーバーヘッドは4バイトになります。

サイズ(プロファイリングによって決定される)32ビットで:
Tuple<int, int>:16バイト
int[2]:20バイト
int[1 to 2] *:28バイト
int[2, 1]:36バイト、64ビットCLRで

Tuple<int, int>:24バイト
int[2]:32バイト
int[1 to 2] *:40バイト
int[2, 1]:48バイト

値型の1次元ゼロベースの配列は可能な限り小さな配列であることに注意してください。参照型を使用すると、格納されているオブジェクトの型の別の4バイト(64ビットの場合は8バイト)が追加されます。非ゼロの配列ベースまたは複数のディメンションを使用すると、ランクと下限の情報を格納する別の種類の配列型を使用し、ディメンションごとに8バイトが追加されます。

参考文献:

*あなたがC#で非0下限を持つ配列を宣言することはできませんので、私が作っ構文int[1 to 2]。しかし、Array.CreateInstance(typeof(int), new[]{2}, new[]{10});を呼び出して2つの要素を持つ配列をインデックス10と11に作ることができます。もちろん、このような配列はC#の型システムでは直接表現できないため、あまり有用ではありませんが、興味深いデータポイントを提供します。

+0

アレイは特別なケースで、IL最適化されたものであっても、CLI自体に追加のオーバーヘッドがあります。 –

0

Tuple<int, int>は、2つの整数フィールドを持つクラスと同じメモリを使用します。一方、アレイは、サイズが16バイトの各ランク(この場合は1つ)に対して、少なくとも32バイトに加えて別のデータ構造(ArrayOpIndexSpecと呼ばれます)を含む非常に大きな内部データ構造(のArrayOpScriptと呼ばれます)を持っています。だから、配列はほとんど確実にTupleより多くのメモリを使用しています。

+0

.Net 4 CLRのプロファイリングでは、多次元配列でも2-intクラスより20バイトまたは24バイトだけ大きいことがわかります。 – Gabe

+0

私はちょうど理性と推測を試みるのではなく、最初にそれを測定したはずです。私の測定値は、.NET4のx86 CLRでint [2]がタプルよりもわずか20%多くのメモリしか消費しておらず、答えと一致しています。 –

関連する問題