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 协议》,转载必须注明作者和本文链接
good good study day day up
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!