小编典典

Go真的没有缩小片段的方法吗?那是个问题吗?

go

我已经尝试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大小参数的实际方法?这是一个问题,应该如何处理?


阅读 296

收藏
2020-07-02

共1个答案

小编典典

实际上执行切片的重新分配:

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

如果它确实将newSize元素复制到新的内存位置,或者是否像realloc(3)一样进行实际
大小调整,则由编译器完全决定。您可能想调查当前的状态,如果还有改进的余地,也许会提出一个问题

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

编辑:以上只是部分正确。在一般情况下,编译器 无法 导出是否有其他指向切片支持数组的指针。因此,重新分配不适用。上面的代码段实际上可以 保证 执行“
newSize”元素的副本。抱歉造成任何混乱。

2020-07-02