我已经尝试Go了一段时间,这个问题一直困扰着我。假设我在一个切片中建立了一个相当大的数据集(例如,一千万个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)) }
但是后来我决定我不想要其中的大多数,因此我只想得到其中的十个。我已经在Go的Wiki上尝试了切片和删除技术,但它们似乎都没有减少切片的容量。
因此,这就是我的问题:realloc()与在C中对同一指针的先前调用相比,Go是否具有缩小-sing大小参数的实际方法?这是一个问题,应该如何处理?
realloc()
实际上执行切片的重新分配:
a = append([]T(nil), a[:newSize]...) // Thanks to @Dijkstra for pointing out the missing ellipsis.
如果它确实将newSize元素复制到新的内存位置,或者是否像realloc(3)一样进行实际 的 大小调整,则由编译器完全决定。您可能想调查当前的状态,如果还有改进的余地,也许会提出一个问题。
newSize
但是,这可能是微优化。性能增强的第一个来源几乎总是在于选择更好的算法和/或更好的数据结构。使用巨大的向量最终只保留一些项可能不是内存消耗的最佳选择。
编辑:以上只是部分正确。在一般情况下,编译器 无法 导出是否有其他指向切片支持数组的指针。因此,重新分配不适用。上面的代码段实际上可以 保证 执行“ newSize”元素的副本。抱歉造成任何混乱。