Ari*_*ein 16 c# memory memory-management reference
在C#中如果我使用以下代码
Dictionary<int,object> dictionary = new Dictionary<int, object>();
dictionary.Add(1,null);
dictionary.Add(2,new object());
dictionary[2] = null;
Run Code Online (Sandbox Code Playgroud)
分配了多少内存?字典中的每个对象引用(字典[1],字典[2])是否在堆上获取指针大小(32或64位)?换句话说,当我执行dictionary.Add(1,null)时,CLR会自动在堆上创建2个分配,一个用于int,一个用于空指针吗?
Thi*_*ilo 16
空指针不分配任何额外的内存来存储堆上的任何东西(因为没有东西要存储).但是,您的字典必须存储空指针本身,它占用的空间与任何其他指针一样多.
每个add调用是否导致新的分配(存储指针)取决于Dictionary实现.通常,它有一个内部数组,可根据需要重新调整大小.
在您的示例中,我假设在创建字典时已经为少数元素分配了足够的空间.所以add(1,null)不会再分配任何空间.
更新:未指定Dictionary的默认初始容量.在.NET 4.0中,它实际上从0开始,因此第一个添加将创建存储阵列.