【发布时间】:2019-11-26 02:02:34
【问题描述】:
根据Golang tour,我们提供了以下整数类型:
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
理论上,这意味着我们还可以拥有指向所有这些类型的指针,如下所示:
*int *int8 *int16 *int32 *int64
*uint *uint8 *uint16 *uint32 *uint64 *uintptr
如果是这种情况,那么我们已经有一个指向 *uint 形式的 uint 的指针。这将使 uintptr 变得多余。 official documentation 对此并没有太多说明:
uintptr is an integer type that is large enough to hold the bit pattern of any pointer.
据我了解,这意味着 uint 的位宽是在编译时根据目标架构(通常是 32 位或 64 位)确定的。指针宽度也应该扩展到目标体系结构似乎是合乎逻辑的(即:32 位 *uint 指向 32 位 uint)。 Golang 是这样的吗?
另一个想法是添加 uintptr 是为了在执行多重间接时减少语法混乱(IE:foo *uinptr vs foo **uint)?
我最后的想法是,指针和整数在 Golang 中可能是不兼容的数据类型。这将非常令人沮丧,因为硬件本身并没有在它们之间做出任何区分。例如,“分支到此地址”指令可以使用来自刚刚在“添加此值”指令中使用的同一寄存器中的相同数据。
uintptr 的真正意义(双关语)是什么?
【问题讨论】:
-
uintptr 基本上是一个指向任何东西的不安全指针,与 uint 无关。
-
我好像忘记了在 64 位系统上运行的 32 位代码。在这种情况下,*uint 将是 4 个字节,而 uintptr 将是 8 个字节。确实,看起来它们是无关的。