如何为Hashtable分配内存?

时间:2010-09-14 06:13:49

标签: c# .net types memory-management

初始化哈希表时,如何为其分配内存?当我们向其添加新成员时,哈希表使用的内存如何扩展?是否曾经发生哈希表无法在固定大小后存储对象?

2 个答案:

答案 0 :(得分:3)

您可以使用.NET reflector查找。

System.Collections.Hashtable包含一些硬限制:

double num = ((float) capacity) / this.loadFactor;
if (num > 2147483647.0)
{
    throw new ArgumentException(Environment.GetResourceString("Arg_HTCapacityOverflow"));
}

还要记住int.MaxSize的容量值(我认为容量可能与桶数相同,具体取决于负载系数)。

但是,如果你达到了这个大小限制,你可能想要研究比内存中的哈希表CLR对象更好的存储方法......

修改

哈希表的内存以这种方式分配:

int num2 = (num > 11.0) ? HashHelpers.GetPrime((int) num) : 11;
this.buckets = new bucket[num2];

[StructLayout(LayoutKind.Sequential)]
private struct bucket
{
    public object key;
    public object val;
    public int hash_coll;
}

请参阅Will对HashHelpers.GetPrime所做的回答。

答案 1 :(得分:2)

Hashtable管理它的大小 - 所以你不会遇到无法插入对象的情况,除非你的内存不足(或者当你试图插入重复的键时)。< / p>

根据docs

  

当实际负载系数达到时   指定的载荷因子,数量   桶自动增加   到最小的素数   大于当前数字的两倍   水桶。