空指针使用多少内存?

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开始,因此第一个添加将创建存储阵列.


els*_*sni 0

我想是的,因为 null 是一个引用。它指向任何地方,但您每次都可以用真实的对象引用替换它。

所以我猜至少分配了 2x64bit,也许字典本身需要额外的空间。