当前位置: 首页 > 面试题库 >

切片如何通过追加放大?容量是否总是增加一倍?

鲁弘厚
2023-03-14
问题内容

append切片时,如果需要可以将切片放大。由于规范未指定算法,因此对此感到很好奇。

我尝试append在Go源代码中找到实现,但是找不到它。

谁能解释扩大切片的指定算法?容量是否总是增加一倍?或任何人都可以提供的源代码位置append吗?我可以自己检查。


问题答案:

append可以在其中找到负责切片的代码。

截至2014-2020年,已实施的规则为:

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

大概这不是规范的一部分,因此将来可以根据需要更改启发式方法。您可以在master分支上检查此实现的最新版本。



 类似资料:
  • 问题内容: 我有零片: 我在其中添加一个元素: 为什么在一个nil slice上附加一个元素会使容量增加2? 使用来打印切片显示以下内容: 我也很困惑为什么重新切片会显示一个零,该零既不在原始切片中也不附加在原始切片上: 问题答案: Go可以免费为您提供超出您要求的容量。通过减少所需的分配(可以复制)数量来提高性能。容量只是在需要另一分配之前保留的空间量。 如果至少在我的实验中将5个元素添加到此片

  • 如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。下面的代码描述了从拷贝切片的 copy 函数和向切片追加新元素的 append 函数。 示例 7.12 copy_append_slice.go package main import "fmt" func main() { sl_from := []int{1, 2, 3} sl_to := mak

  • 问题内容: 为了使切片追加操作更快,我们需要分配足够的容量。有两种附加切片的方法,下面是代码: 结果是: BenchmarkSliceAppend-4 200000000 7.87 ns / op 8 B / op 0 allocs / op BenchmarkSliceSet-4 300000000 5.76 ns / op 8 B / op 比我快,我想知道为什么吗? 问题答案: 只需将值分配

  • 问题内容: 我对Java有一个基本问题。 当使用默认构造函数声明和初始化时,将创建10个元素的内存空间。现在,当我添加第11个元素时,会发生什么?是否将创建具有20个(或更多)元素容量的新内存空间(这需要将元素从第一个内存位置复制到新位置)或其他东西? 我在这里检查。但是我没有找到答案。 请分享知识。谢谢。 问题答案: 创建一个新数组,并将旧数组的内容复制过来。这就是您在API级别上所知道的。引用

  • 首先要澄清的是,我不是在问如何修改单个UISegmentedControl段或按钮的宽度。 我的最终目标是创建嵌入在UIScrollView中的UISegmentedControl。此UISegmentedControl将能够无限期地增加其段数。 为了实现这一点,每次添加一个段时,我都需要增加本身的总宽度。有没有什么方法可以在每次添加段时不重新创建全新的对象的情况下增加总宽度? 提前谢谢你!

  • 问题内容: 在JDK 1.7中,该方法使用以下表达式来增加ArrayList.java的数组容量:因此,看来新容量几乎比旧容量增加了50%。 但是在很多书中都说容量翻了一番…所以书没有更新或我不太了解? 问题答案: 您的理解是正确的,newCapacity比oldCapacity大50% 在Java 6中,newCapacity计算为 这是Java之类的开源语言的魅力,您可以看到实现-如果它不符合