sizeof(void *)是什么意思?为什么要除以它?

8
我正在处理哈希表,并遇到了这个函数。但是hash / sizeof(void*)的意思是什么?然后在它后面给出了注释——摆脱已知的0位?
// This matches when the hashtable key is a pointer.
      template<class HashKey> class hash_munger<HashKey*> {
       public:
        static size_t MungedHash(size_t hash) {
          // TODO(csilvers): consider rotating instead:
          //    static const int shift = (sizeof(void *) == 4) ? 2 : 3;
          //    return (hash << (sizeof(hash) * 8) - shift)) | (hash >> shift);
          // This matters if we ever change sparse/dense_hash_* to compare
          // hashes before comparing actual values.  It's speedy on x86.
          return hash / sizeof(void*);   // get rid of known-0 bits
        }
      };

1
听起来像是“你不应该理解这个”评论。 - BЈовић
2个回答

9

在大多数机器和ABIs上,指针通常是按字对齐的。因此,除以指针的sizeof本质上是忽略最低位(例如,在大多数64位处理器上,字节地址的3个最低位为0,因为64位字有8个字节,每个字节8位)。


ABIs是什么?而“按字对齐”是指它们在内存中连续存储吗? - annunarcist
我在ABIs的维基页面上添加了一个链接。 - Basile Starynkevitch
1
@annunarcist:不,对齐和连续存储几乎没有关系。在C++中,数组总是连续的,而与对齐方式无关,但其他对象可能不是连续的。 - MSalters

2
看起来这是一个指针哈希函数。指针指向对象,通常是对齐的。如果这里指向的对象是通过“new”分配的,则很可能对齐到字边界。
因此,当转换为数字时,它可能总是可被8(或4,如果是字长)整除,并且该函数将您的数字除以8,以便为您提供有关指针的真正重要信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接