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. およびsize void* buf(バイト単位n) を指定すると、ラッパー ベクトルをインスタンス化します。std::vector<int, my_allocator<int>> vec(n, {}, buf);
  4. std::hash(vec)FTW!

昨年、このラッピング トリックについて教えてくれた @hvd に感謝します。

于 2016-02-20T22:53:22.430 に答える