11

空列表或字典使用了多少内存?如:

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

指针本身在 x86 和 x64 操作系统的 64 位上至少占用 32 位,但是列表本身呢?有 0 条记录。

问的原因是,您可以通过将列表设置为来节省一些字节null吗?

(想象一下,你有一个包含一些List<T>在某些情况下正在使用的类,而在其他情况下则不是,在这种情况下,有一个booleanlikeIsEmptynull不是空列表可能会节省一些操作内存。特别是如果你有数千个这样的操作内存中的类,每一位都很重要。)

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 上总共有20个字节(16 个用于List<T>成员,4 个用于元数据引用开销)和32 个在 x64 上,包括对对象类型的引用,.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 回答
0

问的原因是,您可以通过将列表设置为空来节省一些字节吗?

作为一般规则(与任何规则一样,也有例外),您不应将托管对象设置null为释放内存。相反,将其留给垃圾收集器来检测对象何时不再可访问。事实上,设置对的引用null可能会适得其反,因为它实际上可以稍微延长对象的生命周期

一个例外可能是一个边缘情况,值得设置一个大对象null(例如,一个非常大的列表,它是另一个对象的属性,由于某种原因需要保持可访问性),但这种情况很少见,可能表示“代码闻”。

于 2018-11-24T12:46:51.960 回答