(杂记)weak表的精髓(个妹夫)

404 阅读1分钟
  1. 在weakEntry里面,referent 和 referrer 是一对多的关系

  2. referrer 少于2个是数组, 多余2个则变成了长度初始值为4的哈希表

  3. 之所以4位节点,是因为四字节对齐CPU访问更加快速

  4. sidetable是利用了分离锁优化的

  5. weak 细分分为 5种情况,每种都要说

  6. referrer 是 地址指针,之所以使用了地址指针才能解除死循环

  7. referent 查找 sidetable使用的 哈希查找,referent查找weaktable也是用的哈希查找。 但是这两个的哈希算法不一样

  8. init 、 store 、 destory 都是同一个方法的不同模板调用

  9. entry 在变为 哈希表的情况下 为什么 mask是64 而不是 3 ?

第一次会触发下面的函数调用

static void weak_resize(weak_table_t *weak_table, size_t new_size)
{
    size_t old_size = TABLE_SIZE(weak_table);

    weak_entry_t *old_entries = weak_table->weak_entries;
    weak_entry_t *new_entries = (weak_entry_t *)
        calloc(new_size, sizeof(weak_entry_t));

    weak_table->mask = new_size - 1;
    weak_table->weak_entries = new_entries;
    weak_table->max_hash_displacement = 0;
    weak_table->num_entries = 0;  // restored by weak_entry_insert below
    
    if (old_entries) {
        weak_entry_t *entry;
        weak_entry_t *end = old_entries + old_size;
        for (entry = old_entries; entry < end; entry++) {
            if (entry->referent) {
                weak_entry_insert(weak_table, entry);
            }
        }
        free(old_entries);
    }
}

因为,当超过3个的时候,会直接出发扩容,表长度由4直接扩容到8,mask = count - 1 也就是8-1为7

  1. destory 和 weak_clear_no_lock() 的区别在于一个左边 一个右边

  2. location = referrer, newObj = referent