gpt4 book ai didi

go - Go 没有真正的方法来缩小 slice 吗?这是一个问题吗?

转载 作者:IT老高 更新时间:2023-10-28 13:03:48 26 4
gpt4 key购买 nike

我已经尝试 Go 一段时间了,这个问题一直困扰着我。假设我在一个 slice 中构建了一个有点大的数据集(例如,1000 万个 int64)。

package main

import (
"math"
"fmt"
)

func main() {
var a []int64
var i int64;
upto := int64(math.Pow10(7))
for i = 0; i < upto; i++ {
a = append(a, i)
}
fmt.Println(cap(a))
}

但后来我决定我不想要其中的大多数,所以我想最终只得到其中的 10 个。我试过 slice 和delete techniques on Go's wiki但它们似乎都没有减少 slice 的容量。

这就是我的问题:Go 是否没有真正的方法来缩小 slice 的容量,类似于 realloc() -ing 使用比您之前调用C中的相同指针?这是一个问题吗?应该如何处理?

最佳答案

实际上执行一个 slice 的重新分配:

a = append([]T(nil), a[:newSize]...) // Thanks to @Dijkstra for pointing out the missing ellipsis.

如果将 newSize 元素复制到新的内存位置,或者如果它在 realloc(3) 中进行实际的 inplace 调整大小,则完全由编译器。您可能想调查当前状态并可能提出 issue如果这方面还有改进的余地。

但是,这可能是一个微优化。性能增强的第一个来源几乎总是选择更好的算法和/或更好的数据结构。使用一个巨大的向量来最终只保留一些项目可能不是内存消耗的最佳选择。

编辑:以上只是部分正确。编译器不能,在一般情况下,如果有其他指针指向 slice 的支持数组。因此 realloc 不适用。上面的代码片段实际上是保证执行“newSize”元素的副本。对于可能造成的任何困惑,我们深表歉意。

关于go - Go 没有真正的方法来缩小 slice 吗?这是一个问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16748330/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com