【发布时间】:2020-09-28 21:12:40
【问题描述】:
根据文档 (https://golang.org/pkg/unsafe/#Sizeof) unsafe.Sizeof 返回给定表达式的大小(以字节为单位)。理想情况下,任何给定表达式的大小都可以用uint32 或uint64 表示。那为什么 Golang 会返回 uintptr 呢?这不是很混乱吗? uintptr 应该保存一个指向某个数据值的指针,但在这种情况下,它实际上不是一个指针,它只是一个数字,对吧?
【问题讨论】:
-
unitptr是一个整数类型,它大到可以容纳任何指针。因此uintptr大到足以容纳任何值的大小。uint32在某些架构上不够大。uint64在某些架构上比需要的大。 -
A
uintptr不应该保存指针,它只是一个无符号指针大小的值(在不安全的用例之外,您永远不应该将实际指针保存为 uintptr)。它是唯一特定于体系结构的无符号数字类型。 -
还因为
uintptr可以转换为unsafe.Pointer,它可以用于(不安全!)指针运算,可能会使用Sizeof之类的东西。 -
uintptr is an integer type that is large enough to hold the bit pattern of any pointer.- uintptr 类型的官方描述。 -
这不仅仅是一个数字。 (确实如此,但指针也是如此。)它是两个指针之间的差异(指向将由表达式创建的假设变量的开始和结束)。我们本可以添加一个新的
intptrdiff类型,但 C 和uintptr的味道非常匹配。
标签: go