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

why the type castings (UINT)(void*)(DWORD) are needed?

本文关键字:UINT DWORD void 类型 为什么      更新时间:2023-10-16

这是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位机器的兼容性事务有关。但我对空白*感到困惑。

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);
}

这就是今天这个函数的样子。您的版本来自一个非常旧的MFC版本,足够旧,仍然支持16位程序。MFC于1992年首次发布,当时是Windows版本3。MFC版本1.0到2.5支持16位目标。该函数的当前版本适用于32位和64位代码。

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

转换为DWORD会将大小减小为DWORD

转换为void*将减小指针的大小。

从这些类型转换中可以推断出的内容不多,在现实环境中这太过分了,但可以公平地期望优化编译器不会在这些转换中做任何不必要的工作。

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

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

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