Go unsafe包
Sizeof函数
//Sizeof函数可以返回一个类型所占用的内存大小,这个大小只有类型有关,和类型对应的变量存储的内容大小无关,比如bool型占用一个字节、int8也占用一个字节。
func main() {
fmt.Println(unsafe.Sizeof(true))
//对于整型来说,占用的字节数意味着这个类型存储数字范围的大小,比如int8占用一个字节,也就是8bit,
//所以它可以存储的大小范围是-128~~127,也就是−2^(n-1)到2^(n-1)−1,n表示bit,int8表示8bit,int16表示16bit,其他以此类推。
fmt.Println(unsafe.Sizeof(int8(0)))
fmt.Println(unsafe.Sizeof(int16(10)))
fmt.Println(unsafe.Sizeof(int32(10000000)))
fmt.Println(unsafe.Sizeof(int64(10000000000000)))
//对于和平台有关的int类型,这个要看平台是32位还是64位,会取最大的。比如我自己测试,以上输出,会发现int和int64的大小是一样的,因为我的是64位平台的电脑。
fmt.Println(unsafe.Sizeof(int(10000000000000000)))
//返回
1
1
2
4
8
8
}
Offsetof 函数
//字段的偏移量,就是该字段在struct结构体内存布局中的起始位置(内存位置索引从0开始)。
//根据字段的偏移量,我们可以定位结构体的字段,进而可以读写该结构体的字段,哪怕他们是私有的,黑客的感觉有没有。偏移量的概念,我们会在下一小结详细介绍。
func main() {
type user1 struct {
b byte
i int32
j int64
}
var u1 user1
fmt.Println("u1.b 的大小是" + helper.InterfaceHelperObject.ToString(unsafe.Sizeof(u1.b)) + "字节")
fmt.Println("u1.b 的偏移量是 " + helper.InterfaceHelperObject.ToString(unsafe.Offsetof(u1.b)))
fmt.Println("u1.i 的大小是" + helper.InterfaceHelperObject.ToString(unsafe.Sizeof(u1.i)) + "字节")
fmt.Println("u1.i 的偏移量是 "+ helper.InterfaceHelperObject.ToString(unsafe.Offsetof(u1.i)))
fmt.Println("u1.j 的大小是" + helper.InterfaceHelperObject.ToString(unsafe.Sizeof(u1.j)) + "字节")
fmt.Println("u1.j 的偏移量是 "+ helper.InterfaceHelperObject.ToString(unsafe.Offsetof(u1.j)))
}
//返回结果
u1.b 的大小是1字节
u1.b 的偏移量是 0
u1.i 的大小是4字节
u1.i 的偏移量是 4
u1.j 的大小是8字节
u1.j 的偏移量是 8
Alignof 函数
本作品采用《CC 协议》,转载必须注明作者和本文链接