これらの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、Tuple <int、int、int、int、string、int >>
- 2. ソート一覧<タプル<int, int>>インプレース
- 3. メモリ効率の良いマップ<pair <int,int>、set <int>>代替
- 4. カスタムコンパレータ<int型、ペア<int, int>>
- 5. "int - >(int - > int)= <fun>"型の式を使用できますか?
- 6. ベクトル<int> v(istream_iterator <int>(cin)、istream_iterator <int>());
- 7. タプルとPythonのintを比較する
- 8. タプル2 IntとユニティCのメソッドを含む#
- 9. ペア<int,int>ペア
- 10. 定義、初期化、および使用方法 - ベクトル<ベクトル<ペア< int,int >、int>> v C++では?
- 11. ベクトル<pair <int、pair <int,int> >> Pythonのデータ構造
- 12. 読み取り専用ディクショナリ<int、List <int>>
- 13. SQL [int]とint
- 14. int文字列のリスト/タプルをintに変換する
- 15. リストを変換する<int[]> int [、]
- 16. のstd :: PRIORITY_QUEUE ::ペア<int, int>
- 17. リターンするC#Linqクエリ<int,int[]>
- 18. unorderable types:str()<int()
- 19. Javaの結果は、(int)Math.pow(2、x)と1 << x
- 20. SMLのint - > int - > intと(int * int) - > intの違いは何ですか?
- 21. IqueryableとIterableを交差させる<int>とSqlQuery <int>
- 22. WCFデータサービスとオブザーバブルコレクション<int>
- 23. 「マージ(のstd ::ベクトル<int>&、のstd ::ベクトル<int>&)
- 24. マルチセットでの下限の検索<pair <int,int>>(C++)
- 25. Date(int、int、int)コンストラクタを使用しようとしています
- 26. インパラ:INTとARRAYの要素を一致させよ<INT>
- 27. "multiset <int、greater <int>> ms1"と "multiset <int> ms2(より大きい<int>()の違いは何ですか?"
- 28. <Int> == <String>
- 29. unique_ptr <int[]>またはベクター<int>?
- 30. swigのtypemapを使用してC++メソッドからタプルのリストにベクトル<pair <int,int>>を返します。
アレイは特別なケースで、IL最適化されたものであっても、CLI自体に追加のオーバーヘッドがあります。 –