英文:
Consistency of the pointer to a slice element
问题
考虑以下简单的代码示例:
s := make([]int, 0, 10<<20) // 创建一个包含1000万个int项的切片
s = append(s, 123456789) // 追加任意随机数
p := &s[0] // 指向切片第一个元素的指针
// 添加新项。切片预计会在内存中重新分配。
for i := 0; i < 100<<20; i++ {
s = append(s, i)
}
那么问题是:如果在追加操作(append())后切片"s"被重新分配,指针"p"是否也会指向切片"s"的新的第一个元素的地址?即"p"是否始终保存对值"123456789"的地址引用?还是需要重新创建指针?
提前感谢。
英文:
Consider the simple code sample:
s := make([]int, 0, 10<<20) // Create a slice with 10M int items
s = append(s, 123456789) // Append any random number
p := &s[0] // Pointer to a 1st element of the slice
// Adding new items. Slice expected to be re-allocated in the memory.
for i := 0; i < 100<<20; i++ {
s = append(s, i)
}
So, the question is: In case of slice "s" was re-allocated after append(), will pointer "p" also point to a new address of the 1st element of the slice "s" ? I.e. "p" always hold an address to the value "123456789". Or pointer need to be re-created?
Thanks in advance.
答案1
得分: 3
指针 p
将始终指向从第一个追加返回的 s
的第一个元素。连续的追加操作将创建新的数组,并将切片的内容复制到这些数组中,但是 p
将继续指向同一个数组的第一个元素。在中间的追加操作期间分配的数组将被垃圾回收,但是最后一个分配给 s
的数组和 p
指向的第一个数组只要 s
和 p
保持活动状态,就不会被回收,因为它们有活动的引用。
英文:
Pointer p
will always point to the first element of s
that was returned from the first append. Consecutive appends will create new arrays and copy the contents of the slice to those arrays, but p
will continue to point to the first element of the same array. The arrays allocated during the intermediate appends will be garbage collected, but the last one assigned to s
, and the first one pointed to by p
will not be as long as s
and p
are kept alive, because there are active references to them.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论