如果我使用以下代码在 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/