0

我今天在工作场所学到了这一点。在发布我的问题之前,我阅读了这个这个这个。

这是我的高级同事告诉我的:

您不能将 void* 分配给 UINT 或 unsigned int。它不适用于 64 位。

但为什么?是因为在不同的架构void*unsigned int承载不同的大小(如其他问题中所述),还是其他原因?

4

4 回答 4

2

您基本上是正确的: 不能保证 aunsigned int具有与 a 相同的机器字长void*,因此您不能在它们之间进行转换而不会丢失信息。 是一个很好的常见问题解答。

要记住的主要事情是这void*是一个任意数据指针,而不是一个真正的任意指针。事实上,没有真正通用的指针这种东西:例如,某些机器可能有不同的程序和数据地址空间,因此指向每个机器的指针的大小可能不同。有关更多信息,请参阅此 SO 答案

于 2014-07-02T13:43:35.303 回答
2

是的,就是这样。

但是,您的实现可能会提供可选的 type uintptr_t,其定义如下:

以下类型指定了一个无符号整数类型,其属性是任何指向 void 的有效指针都可以转换为此类型,然后转换回指向 void 的指针,结果将与原始指针进行比较:

uintptr_t

签署的副本intptr_t也可能可用。这些类型在<cstdint>标题中可用。

通过选择使用这些类型,您承认您的代码将仅与在您的目标机器上提供此类型的实现子集一起编译。

于 2014-07-02T13:44:39.823 回答
2

尺寸显然是个障碍,如果void*身体不能适应unisigned int游戏就结束了。但即使sizeof(void*) == sizeof(unsigned int)您有类型兼容性问题:一个持有数据指针,另一个持有数据。你必须reinterpret_cast<>()一个对另一个,所有的赌注都是关于这将如何运作的。

于 2014-07-02T13:44:56.617 回答
1

取决于您的应用程序的目标。您标记VC++并提及类型UINT- 因此您似乎正在为 Windows 构建。在 32 位 Windows 中,指针大小为 32 位,而在 64 位 Windows 中,指针大小为 64 位。但是,UINT对于这两种 Windows 风格,类型大小的定义类似于 32 位。您可以使用__uint64UINT64特定于 MS 的类型而不是 UINT 以确保它对于您的指针足够大。您还可以使用专门设计用于匹配指针大小的INT_PTR/UINT_PTR类型(从而使其对 32/64 位风格透明)。

有关各种数据类型的参考,请参阅http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx

当然,所有这些都会使您的程序无法原生地移植到其他架构/操作系统。

于 2014-07-02T14:02:23.537 回答