如何通过追加扩大切片?容量总是翻倍?

Nan*_*iao 10 go

append切片时,如果需要,可以放大切片.因为规范没有指定算法,我很好奇.

我试图append在Go源代码中找到实现,但找不到它.

任何人都可以解释指定的放大切片算法吗?容量总是翻倍?或者任何人都可以提供源代码的位置append?我可以自己检查一下.

Jam*_*dge 11

负责增长切片的代码append可以在这里找到.

所以在当前的实现中,规则是:

  1. 如果附加到切片将使其长度增加两倍以上,则新容量将设置为新长度.
  2. 否则,如果当前长度小于1024,则容量加倍,如果大于1024,则加倍25%.重复此步骤,直到新容量符合所需长度.

据推测,这不是规范的一部分,因此如果需要,将来可以改变启发式方法.

  • 编译器将`append`调用转换为适当的`runtime.growslice`调用,然后将新值分配给切片的末尾.您可以在汇编输出中看到这一点,例如`go tool 8g -S filename.go` (2认同)

小智 8

在 Go 1.18 中它发生了变化。

提交消息备忘录:

    starting cap    growth factor
    256             2.0
    512             1.63
    1024            1.44
    2048            1.35
    4096            1.30
Run Code Online (Sandbox Code Playgroud)