3

GNU C++ 标准库有:

  struct _Hash_impl
  {
    static size_t
    hash(const void* __ptr, size_t __clength,
     size_t __seed = static_cast<size_t>(0xc70f6907UL))
    { return _Hash_bytes(__ptr, __clength, __seed); }
    /* etc. */
  }

作为其实现的一部分(例如,这就是它在字符串上使用的内容)。现在,我也想使用该代码......我怎样才能以可移植的方式访问它(例如,以一种可以与 clang 的 libc++ 一起使用的方式)?

4

2 回答 2

4

没有。您无法以可移植的方式访问编译器的内部实现细节。这怎么可能行得通?

您甚至无法确定在同一编译器供应商的下一次编译器更新之后该实现是否仍然存在。或者更糟的是,它可能仍然可以正常编译,但具有不同的运行时行为。这是可维护性的噩梦,也是等待发生的无休止的调试会话。

如果您将来需要可移植性或向后兼容性,请实现自己的哈希函数并模仿_Hash_impl.

于 2016-02-20T22:36:20.483 回答
0

我一直在想,也许我可以在不实际执行的情况下获得无聊到实现的效果。我还没有实现这个,但我相信它应该可以工作:

  1. 编写一个my_allocator不允许重新分配的自定义分配器
  2. 我们现在可以使用std::vector<char, my_allocator>包装原始缓冲区的类std::vector
  3. 给定void* buf字节大小n,我们实例化一个包装向量:std::vector<int, my_allocator<int>> vec(n, {}, buf);
  4. 现在std::hash(vec)FTW!

感谢@hvd去年指导我这个包装技巧

于 2016-02-20T22:53:22.430 回答