Go语言中unsafe.Sizeof与reflect.TypeOf().Size()的差异原因探究
为什么unsafe.Sizeof()与reflect.TypeOf().Size()对数值类型返回不同值?
你遇到的差异核心原因是两者测量的对象完全不同:
unsafe.Sizeof(i)测量的是参数i本身的大小,而i是一个interface{}(空接口)类型的变量。在64位系统中,空接口的大小固定为16字节——它由两个8字节的指针组成:一个指向类型信息,另一个指向实际存储的数据。reflect.TypeOf(i).Size()测量的是空接口i底层包裹的具体值的类型大小,比如int、float64这些基础数值类型在64位系统中本身大小就是8字节。
结合你的测试代码和输出分析:
- 对于
string和自定义结构体:它们本身的大小就是16字节(string由指向字节数组的指针和长度组成;结构体包含一个string字段,总大小也是16),所以unsafe.Sizeof(i)(空接口大小)和reflect.TypeOf(i).Size()(实际类型大小)结果一致。 - 对于
int、float64:这些类型本身大小是8字节,但它们被包裹在空接口i中,所以unsafe.Sizeof(i)返回空接口的16字节,而reflect.TypeOf(i).Size()返回实际类型的8字节。
如果要让unsafe.Sizeof()直接测量具体类型的大小,可以直接作用于原始变量,比如:
fmt.Println(unsafe.Sizeof(55)) // 输出8 fmt.Println(unsafe.Sizeof(1.1)) // 输出8
这时候结果就会和reflect.TypeOf().Size()完全一致。
内容的提问来源于stack exchange,提问作者noob-Programmer
相关产品推荐
相关产品推荐

