为什么需要类型铸件(UINT)(void*)(DWORD)
why the type castings (UINT)(void*)(DWORD) are needed?
这是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)
的最后一个强制转换是将指针强制转换为无符号整数,以获得数字形式的内存地址。
相关文章:
- 以十六进制打印出 DWORD 会在 win32 c++ 中返回0x7FFFFFFF
- GLSL 将 uint 转换为浮点颜色
- 非法,左操作数具有类型 'DWORD [29]'
- 定义 uint= "unsigned int" 没有像我在 Visual Studio 中使用 nvcc 时预期的那样应用
- 编译时出错 - 从 DWORD 到 LPCVOID 的转换
- 如何在 c++ 中将 DWORD 转换为 PVOID?
- C++添加 2 个 DWORD 的算术溢出
- 是否可以将存储在dword中的十六进制与getasynckeystate一起使用
- 三维数组中的C/C++DWORD到BYTE和BYTE到DWORD的转换
- 着色器将uint8投射到float,并将其重新解释回uint
- 如何将boost::asio::ip::address_v6 ip转换为2个uint64_t数字,并从2个uint 64
- 警告 C4267"参数":从"size_t"转换为"DWORD&quo
- 键入从 DWORD 到 64 位指针的强制转换警告
- 警告 C4267"正在初始化":从'size_t'转换为"DWORD",可能会丢失数据
- 将 CRC uint 转换为 QByteArray QT - C++
- OSX 上的 GCC 5、6 和 7 不支持 uint
- 是否可以将 Dword 转换为类型名称
- C++ - DWORD Decimal to DWORD Hexadecimal
- std ::函数方法参考无法将dword投入到dword64
- 为什么需要类型铸件(UINT)(void*)(DWORD)