【问题标题】:How much space (bytes) does an empty data structure take? [duplicate]空数据结构占用多少空间(字节)? [复制]
【发布时间】:2017-09-08 15:55:27
【问题描述】:

在一个 32 位点网程序中,我想向一个类添加一个新字段。该字段将是一个 字典 .由于存在该类的数千个实例,我想知道这将需要多少额外的内存。对于大多数情况,我可能永远不会用任何值填充此字段。

空字典占用多少内存?

【问题讨论】:

  • 我同意这个问题之前已经回答过,但需要注意的一点是取决于您如何编写代码。如果您很聪明并且在需要字典之前不初始化字典,那么额外的内存将是最小的,只是类中引用的成本。如果您总是实例化字典,那么您可以在@Pac0 的链接中找到一些开销
  • 复制不是复制。这是一个不同的问题。

标签: c# .net memory


【解决方案1】:

对于大多数情况,我可能永远不会用任何值填充此字段。

那么对于大多数情况,空引用将是 4 个字节。如果您在回答中提到的 32 位细节之外对其进行了调整,则在 64 位上为 8。

空字典占用多少内存?

这是一个不同的问题,因为在这里您似乎用空字典填充了它,这与不填充它不同。大小会因库版本而异,但大约为 40 字节。

为什么要这样做?如果它很少使用,那么很少设置它。仅在要写入时设置它,否则将其保留为 null,并让看起来读取它的代码找到 null 的“不存在”答案,就像它为空一样。

public void Add(string key, object value)
{
  if (_dict == null)
  {
    _dict = new Dictionary<string, object>();
  }

  _dict.Add(key, value);
}

public bool TryGetValue(string key, out object value)
{
  if (_dict != null)
  {
    return _dict.TryGetValue(key, out value);
  }

  value = null;
  return false;
}

【讨论】:

  • 谢谢(以及其他人)。如果我要序列化和取消实现实例,是否可以将值保留为 null?反序列化将涉及在 SerializationInfo 对象上调用 GetValue。如果该字段为空,那可以吗?
  • 是的,毕竟空值可以被序列化。
【解决方案2】:

“从不填充”,我假设您的意思是:

Dictionary<string,object> myDic = null;

如果您担心内存使用情况,这可能是最好的 - 在您知道自己需要一个新字典之前不要实例化一个新字典。那么答案基本上只是每个实例中保存变量引用所需的内存,这是微不足道的。

如果您确实需要实例化字典,则(当前)默认大小为零元素。您可以覆盖该初始容量,但除非您提出要求,否则我不会使用算法来扩展容量。

所以基本上,无论哪种方式,您都会使用很少的内存。

【讨论】:

    【解决方案3】:

    Dictionary&lt;T, K&gt; 是引用类型,这意味着实例在堆上分配并由句柄引用。

    由于您没有填充该字段,因此句柄将保留其默认的 null 值。因此,唯一的开销是句柄本身的大小,它与IntPtr 相同(32 位运行时为 32 位,64 位运行时为 64 位)。

    这可以通过在分配大量句柄后检查托管堆的大小来轻松验证:

    var start = GC.GetTotalMemory(true);
    var handles = new Dictionary<string, object>[100000];
    var sizeApprox = (GC.GetTotalMemory(false) - start) / 100000.0;
    GC.KeepAlive(handles);
    Console.WriteLine("A handle takes {0:0.##} bytes", sizeApprox);
    // Prints 4 in x86 mode and 8 in x64 mode
    

    【讨论】:

      猜你喜欢
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多