我想了解创建空切片时会发生什么make([]int, 0)
。我执行此代码进行测试:
emptySlice := make([]int, 0)
fmt.Println(len(emptySlice))
fmt.Println(cap(emptySlice))
fmt.Println(unsafe.Sizeof(emptySlice))
size和capacity返回很明显,都是0,但是slice的大小是24字节,为什么呢?
24字节应该是3int64
正确的? 24 字节切片的一个内部数组应该类似于:[3]int{}
,那么为什么一个空切片有 24 个字节呢?
如果您阅读了文档 https://golang.org/pkg/unsafe/#Sizeof for unsafe.Sizeof
,它解释了这里发生的事情:
该大小不包括 x 可能引用的任何内存。例如,如果 x 是一个切片,则 Sizeof 返回该切片的大小切片描述符,而不是切片引用的内存的大小。
Go 中的所有数据类型都是静态大小的。尽管切片具有动态数量的元素,但这不能反映在数据类型的大小中,因为那样它就不是静态的。
“切片描述符”,顾名思义,是描述切片的所有数据。这就是切片变量中实际存储的内容。
Go 中的切片有 3 个属性:底层数组(内存地址)、切片长度(内存偏移量)和切片容量(内存偏移量)。在 64 位应用程序中,内存地址和偏移量往往以 64 位(8 字节)值存储。这就是为什么您看到的大小为 24 (= 3 * 8 ) 字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)