11

空のリストまたは辞書で使用されるメモリの量は? そのような:

List<double> list = new List<double>();

ポインター自体は、x86 OS では少なくとも 32 ビット、x64 OS では 64 ビットを消費しますが、リスト自体はどうでしょうか? 0 レコードあり。

質問する理由は、リストを に設定することで数バイトを節約できるかということnullです。

List<T>(場合によっては使用され、他の場合には使用されていないものを含むクラスがあると想像してください。その場合、空のリストの代わりにbooleanlikeIsEmptyとlike を使用するとnull、操作メモリを節約できる可能性があります。特に、そのようなものが何千もある場合オペレーティング メモリ内のクラス、すべてのビットがカウントされます。)

4

2 に答える 2

20

dotPeek で逆コンパイル:

public class List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable
{
    private T[] _items; //4 bytes for x86, 8 for x64
    private int _size; //4 bytes
    private int _version; //4 bytes
    [NonSerialized]
    private object _syncRoot; //4 bytes for x86, 8 for x64
    private static readonly T[] _emptyArray; //one per type
    private const int _defaultCapacity = 4; //one per type
    ...
}

x86 では合計20List<T>バイト (メンバー用に 16 バイト、メタデータ参照オーバーヘッド用に 4 バイト)、 x64 では32バイト ( .net の各オブジェクトが持つオブジェクトの型への参照を含む) が得られます。この計算は、アライメントを考慮せずに大まかに行われます。


public class Dictionary<TKey, TValue> : ...
{
    private int[] buckets; //4 bytes for x86, 8 for x64
    private Dictionary<TKey, TValue>.Entry[] entries; //4 bytes for x86, 8 for x64
    private int count; //4 bytes
    private int version; //4 bytes
    private int freeList; //4 bytes
    private int freeCount; //4 bytes
    private IEqualityComparer<TKey> comparer; //4 bytes for x86, 8 for x64
    private Dictionary<TKey, TValue>.KeyCollection keys; //4 bytes for x86, 8 for x64
    private Dictionary<TKey, TValue>.ValueCollection values; //4 bytes for x86, 8 for x64
    private object _syncRoot; //4 bytes for x86, 8 for x64

    private const string VersionName = "Version"; //one per type
    private const string HashSizeName = "HashSize"; //one per type
    private const string KeyValuePairsName = "KeyValuePairs"; //one per type
    private const string ComparerName = "Comparer"; //one per type
}

x86 の場合は44 、 x64の場合は72です。異なるオブジェクトのインスタンスが必要なため、ここでも大まかな計算になります。

于 2013-04-21T13:38:51.810 に答える