c# - 空指针使用多少内存?

标签 c# memory reference memory-management

如果我使用以下代码在 C# 中

Dictionary<int,object> dictionary = new Dictionary<int, object>();
dictionary.Add(1,null);
dictionary.Add(2,new object());
dictionary[2] = null;

分配了多少内存? 字典(字典 [1]、字典 [2])中的每个对象引用是否在堆上采用指针大小(32 位或 64 位)?换句话说,当我执行 dictionary.Add(1,null) 时,CLR 是否会自动在堆上创建 2 个分配,一个用于 int,一个用于空指针?

最佳答案

空指针不会分配任何额外的内存来存储堆上的任何东西(因为没有东西可以存储)。但是,您的字典必须存储空指针本身,这与任何其他指针占用的空间一样多。

每次 add 调用是否导致新的分配(以存储指针)取决于 Dictionary 实现。通常,它有一个内部数组,可以根据需要调整大小。

在您的示例中,我假设在您创建字典时已经为几个元素分配了足够的空间。所以 add(1, null) 不会再分配空间了。

更新:default initial capacity for Dictionary未指定。在 .NET 4.0 中,它实际上从 0 开始,所以第一次添加将创建存储数组。

关于c# - 空指针使用多少内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3801878/

相关文章:

Java 堆大小减少

iphone - NSAutoreleasePool 和类变量

c# - 为什么 VS 2015 允许属性以空格分隔而 VS 2017 不允许?

c# - 从字符串方法名称调用方法

c# - 是否可以从使用 dotnet build 创建的 .NET 程序集中删除完整路径?

c++ - "There is no “reference-to-member” type in C++", std::bind 和 boost::bind 在同一条船上

c# - 从 IValueConverter 获取对代码隐藏类实例的引用

c# - 选择列表中的项目时如何将属性值设置为 null

java - TCPTransportConnection 内存泄漏

arrays - Perl 中的引用 : Array of Hashes