Go 是否优化了切片操作的重用?

问题描述 投票:0回答:1

我很难弄清楚 Go 中切片的内存占用切片操作是否优化。在实践中可能并不重要,但我只是好奇。

我在代码中所做的基本上是对已经存在的切片进行切片,在返回它之前,我还想记录它。我很好奇如果我在基本切片上调用相同的切片操作,如果它的内存占用是相同的。所以问题是编译器是否识别出这是同一个数组,或者它创建了两个单独的指针。

一个非常简单的例子是:

a := make([]int, 10)


log.Msgf("the subarray is: %v", a[:4])

return a[:4]

挑战在于,根据 go 编译器规范,裸切片操作的结果不符合打印其地址的条件。下面的代码会告诉我答案,如果在连续打印中切片数组内存地址是否相同,但它在 Go 中不起作用:

a := make([]int, 10)
fmt.Printf("The address is: %p", a[:4]) // Not addressable
fmt.Printf("The address is: %p", a[:4])
go compiler-optimization
1个回答
0
投票

所以问题是编译器是否识别出这是同一个数组,或者它创建了两个单独的指针。

不,Go 运行时不会这样做,即使您使用

a[:4]
仅引用子切片,该子切片的容量仍然与初始切片相同。 即使最终没有引用
a
,剩余的元素仍然分配在内存中。即使您只想保留子切片,保存切片的支持数组仍然保留所有十个元素。

推荐的方法是制作切片副本而不是切片

a

b := make([]byte, 5)
copy(b, a)

并返回

b
的值,这样每次都可以GC-d原切片。

© www.soinside.com 2019 - 2024. All rights reserved.