var a = [...]int{1,2,3,4,5,6}
s1 := a[2:4:5]假设s1超出作用域范围,比a更晚。gc怎么知道如何回收S1的底层数组a的内存?
考虑s1,等级库的运行时表示
type SliceHeader struct {
Data uintptr
Len int
Cap int
}GC甚至不知道一个。
发布于 2018-09-01 11:12:19
Go使用标记和扫描收集器作为当前的实现。
根据该算法,将有一个根对象,其余为树形结构,在多核机器上运行时,gc将与一个核上的程序一起运行。
gc将遍历树,当某些东西无法到达时,认为它是免费的。
Go对象也有对象的元数据,如本帖子中所述。
节选:
我们需要一些关于对象的信息,因为我们没有头文件。标记位保持在侧面,用于标记和分配。每个单词都有2位与其相关联,以告诉您它是一个标量还是一个指针在这个词内。它还编码了对象中是否有更多的指针,这样我们就可以尽早停止扫描对象。
go的切片(切片头)的原因是结构而不是指向结构的指针,这是russ在此页面的slice部分中记录的。
这是一段节选:
Go最初将片表示为指向结构(片头)的指针,但这样做意味着每个片操作都分配了一个新的内存对象。即使使用快速分配器,这也为垃圾收集器带来了许多不必要的工作,我们发现,与字符串一样,程序避免了切片操作,而更倾向于传递显式索引。删除间接和分配使得切片足够便宜,以避免在大多数情况下传递显式索引。
数组的大小(长度)是其类型的一部分。[1]int和[2]int的类型是不同的。
要记住的一件事是,go是面向价值的语言,而不是存储指针,而是存储直接的值。
[3]int,数组是go中的值,所以如果您传递一个数组,它会复制整个数组。[3]int --这是一个值(作为一个整体)。
当一个用户执行a[1]时,您将访问该值的一部分。
SliceHeader数据字段表示认为这是数组的基点,而不是a[0]。
据我所知:
当有人请求a[4]时,
a[0]+(sizeof(type)*4)是计算出来的。
现在,如果您通过片s = a[2:4]访问某个内容,如果一个请求s[1],那么您所请求的是,
a[2]+sizeof(type)*1https://stackoverflow.com/questions/52126085
复制相似问题