C++ 为什么需要类型铸件(UINT)(void*)(DWORD)?

C++ 为什么需要类型铸件(UINT)(void*)(DWORD)?,c++,c,mfc,casting,C++,C,Mfc,Casting,这是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位机器的兼容性事务有一些关系。但是我对void

这是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位机器的兼容性事务有一些关系。但是我对void*感到困惑,转换为
DWORD
会将大小减少为
DWORD

强制转换为
void*
会将大小减小为指针


从这些强制转换中可以推断出的内容不多,在现实环境中这是多余的,但是可以公平地期望优化编译器不会通过这些转换执行任何不必要的工作

这里需要转换到
DWORD
(双字)来告诉CPU他需要移动哪些字节。在这种情况下,他只移动
DWORD
位。
(void*)
转换是将数字移动4次到指针(转换到通用地址大小)

操作系统(32b系统或64b系统)之间的void*大小可能不同,因为您必须进行此转换。

(UINT)
的最后一次强制转换是将指针强制转换为无符号整数,以获取作为数字的内存地址。

模板
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);
}
AFX_内联UINT AFXAPI哈希键(ARG_键) { //默认标识哈希-适用于大多数基本值 返回(DWORD)(((DWORD_PTR)键)>>4); }
这就是今天函数的样子。您的版本来自一个非常旧的MFC版本,它已经足够支持16位程序了。MFC首次发布于1992年,也就是Windows版本3发布的日子。MFC版本1.0到2.5支持16位目标。该函数的当前版本适用于32位和64位代码


在16位代码中,可以选择的一个选项是内存模型。您可以选择便宜的16位近指针或昂贵的32位远指针。因此,额外的void*cast会将值修剪为内存模型大小。

不,没有理由。写这段代码的人根本不知道他们在做什么。不知道,但是
(void*)
(UINT)
(DWORD)
中的一个都是无用的。@R。。此代码段摘自“使用MFC编程Windows”"可能有人在做什么。@R..考虑到您不知道该函数的历史或原始程序员的意图,认为编写该函数的人不知道他们在做什么是有点天真的。汉斯·帕桑解释说,在最初编写代码时,这种疯狂是有点疯狂的。但事实并非如此它表示sizeof(DWORD)==sizeof(void*)?所以转换毫无意义?指针的大小在机器上不同。在64位机器上,void*是64位的。