gpt4 book ai didi

c# - 空列表或字典的内存使用情况?

转载 作者:IT王子 更新时间:2023-10-28 23:35:14 30 4
gpt4 key购买 nike

一个空的 List 或 Dictionary 使用了多少内存?如:

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

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

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

(假设您有一个包含一些 List<T> 的类,在某些情况下正在使用,而在其他情况下则没有,在这种情况下,有一个 booleanIsEmptynull 而不是空列表可能会节省一些操作内存。尤其是在操作内存中有数千个这样的类的情况下,每一位都很重要。)

最佳答案

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 个字节(List<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
}

44 用于 x86,72 用于 x64。再次粗略计算,因为需要不同对象的实例。

关于c# - 空列表或字典的内存使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16131641/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com