これらの2つのメモリの違いを知っている人はいますか?それとも、どうやって簡単にそれを理解するのでしょうか?タプル<int, int>とint [2]のメモリ使用
答えて
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バイトが追加されます。
参考文献:
- http://www.codeproject.com/KB/dotnet/arrays.aspx
- http://www.codeproject.com/KB/cs/net_type_internals.aspx?fid=459323&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2567811
- http://msdn.microsoft.com/en-us/magazine/cc301755.aspx
*あなたがC#で非0下限を持つ配列を宣言することはできませんので、私が作っ構文int[1 to 2]
。しかし、Array.CreateInstance(typeof(int), new[]{2}, new[]{10});
を呼び出して2つの要素を持つ配列をインデックス10と11に作ることができます。もちろん、このような配列はC#の型システムでは直接表現できないため、あまり有用ではありませんが、興味深いデータポイントを提供します。
Tuple<int, int>
は、2つの整数フィールドを持つクラスと同じメモリを使用します。一方、アレイは、サイズが16バイトの各ランク(この場合は1つ)に対して、少なくとも32バイトに加えて別のデータ構造(ArrayOpIndexSpec
と呼ばれます)を含む非常に大きな内部データ構造(のArrayOpScript
と呼ばれます)を持っています。だから、配列はほとんど確実にTuple
より多くのメモリを使用しています。
.Net 4 CLRのプロファイリングでは、多次元配列でも2-intクラスより20バイトまたは24バイトだけ大きいことがわかります。 – Gabe
私はちょうど理性と推測を試みるのではなく、最初にそれを測定したはずです。私の測定値は、.NET4のx86 CLRでint [2]がタプル
- 1. ソート一覧<タプル<int, int>>インプレース
- 2. カスタムコンパレータ<int型、ペア<int, int>>
- 3. "int - >(int - > int)= <fun>"型の式を使用できますか?
- 4. ベクトル<int> v(istream_iterator <int>(cin)、istream_iterator <int>());
- 5. ペア<int,int>ペア
- 6. Javaの結果は、(int)Math.pow(2、x)と1 << x
- 7. WCFデータサービスとオブザーバブルコレクション<int>
- 8. <Int> == <String>
- 9. swigのtypemapを使用してC++メソッドからタプルのリストにベクトル<pair <int,int>>を返します。
- 10. 「マージ(のstd ::ベクトル<int>&、のstd ::ベクトル<int>&)
- 11. unique_ptr <int[]>またはベクター<int>?
- 12. テンプレート関数(intとint *)の2つの特殊化。コンパイルエラー
- 13. constポインタをintに宣言しますか?</p> <pre><code>int* p1; // pointer to int const int* p2; // pointer to constant int int* const p3; // constant pointer to int const int* const p4; // constant pointer to constant int </code></pre> <p>とDに:私たちは、次のしているC++では
- 14. unorderered_set <tuple <int,int>>の方法は?
- 15. ASP.NETハッシュリスト<int>
- 16. std :: function <int(int)>をstd :: function <const int&(const int&x)>に割り当てる
- 17. は 'System.Collections.Generic.IEnumerable <int?>'
- 18. C++:マップ<string, int>をイテレータを使用してベクトル<map <string, int>>にプッシュバックしますか?
- 19. はint型とunsigned int型
- 20. argv []をintとしてどのように取得できますか?私はこれを行う</p> <pre><code>int main (int argc, char *argv[]) { printf("%d\t",(int)argv[1]); printf("%s\t",(int)argv[1]); } </code></pre> <p>とシェルで:
- 21. スカラ:(INT、INT)=> intは一致していない(INT、INT)=>のInt
- 22. "int * a = new int"と "int * a = new int()"の違いは何ですか?
- 23. のIList <int>は[]
- 24. "+ ="演算子とint longの使用
- 25. 32bit int * 32bit int = 64ビットint?
- 26. リスト内のintの合計範囲<int>
- 27. ARMA :: rowvec ::ベクトル<int>
- 28. printfnのしくみint * int * int型
- 29. ベクトル<int> :: size_type in C++
- 30. BufferedImage.getSubimage(int x、int y、int w、int h)メソッドのガイダンス?
アレイは特別なケースで、IL最適化されたものであっても、CLI自体に追加のオーバーヘッドがあります。 –