5

これは、MFCのCMapクラスのデフォルトのHashKey関数です。

AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
  // default identity hash - works for most primitive values
  return ((UINT)(void*)(DWORD)key) >> 4;
}

私の質問は、なぜ型キャスト(DWORD)(void *)が必要なのかということです。(DWORD)は、16ビットマシンの互換性と何らかの関係があるのではないかと思います。しかし、私はボイド*について混乱しています。

4

3 に答える 3

8
template<class ARG_KEY>
AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
{
    // default identity hash - works for most primitive values
    return (DWORD)(((DWORD_PTR)key)>>4);
}

それが今日の関数の外観です。お使いのバージョンは、16 ビット プログラムをサポートするのに十分古い MFC の非常に古いバージョンからのものです。MFC は、Windows バージョン 3 の時代である 1992 年に最初にリリースされました。MFC バージョン 1.0 から 2.5 は、16 ビット ターゲットをサポートしていました。関数の現在のバージョンは、32 ビットおよび 64 ビットのコードに適しています。

16 ビット コードでは、選択する 1 つのオプションはメモリ モデルでした。安価な 16 ビットNearポインターまたは高価な 32 ビット Far ポインター選択できます。そのため、追加の void* キャストにより、値がメモリ モデル サイズにトリミングされます。

于 2013-02-25T13:28:21.297 に答える
2

にキャストするDWORDと、サイズがに縮小されますDWORD

toをキャストするvoid*と、サイズがポインタに縮小されます。

これらのキャストから推測できることはそれほど多くなく、現実的な環境ではやり過ぎですが、最適化コンパイラがこれらの変換を通じて不要な作業を行わないことを期待するのは当然です。

于 2013-02-25T04:47:36.363 に答える
1

DWORDここでは、 (ダブル ワード)へのキャストが必要です。この場合、シフトする必要があるバイトを CPU に伝えるために必要です。この場合、彼はDWORDビットのみをシフト(void*)します。 )。

void* のサイズは OS (32b システムまたは 64b システム) 間で異なる可能性があるため、このキャストを行う必要があります。

への最後の(UINT)キャストは、ポインタを符号なし整数にキャストして、メモリ アドレスを数値として取得することです。

于 2013-02-25T07:16:11.817 に答える