【问题标题】:Assigning void* to UINT or unsigned int将 void* 分配给 UINT 或 unsigned int
【发布时间】:2014-08-23 08:05:47
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否尝试过printf("%u\n", sizeof(void*)); 将您的每个编译器都作为标签包含在内?
  • 相关:viva64.com/en/k/0005 简而言之,是的,大多数系统都存在差异。

标签: c++ visual-c++ gcc visual-c++-2010 visual-c++-2012


【解决方案1】:

是的,就是这样。

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

以下类型指定一个无符号整数类型,其属性是任何有效的 指向 void 的指针可以转换为这种类型,然后再转换回指向 void 的指针, 结果将等于原始指针:

uintptr_t

签名的对应方intptr_t 也可能可用。这些类型在 <cstdint> 标头中可用。

选择使用这些类型,即表示您承认您的代码只会使用在您的目标机器上提供此类型的实现子集进行编译。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 虽然 void* 不是通用数据指针是正确的,但问题是 void* 的大小与整数大小的比较。
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-10-07
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 2012-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多