MST

星途 面试题库

面试题:Go语言切片slice扩容机制与内存分配

详细描述Go语言切片slice的扩容机制,包括在不同情况下(如当前容量小于1024和大于等于1024)扩容的策略,以及扩容过程中内存是如何重新分配和数据迁移的?
45.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 总体概述
    • Go语言切片(slice)在容量不足时会自动扩容。扩容操作涉及新内存的分配和旧数据的迁移。
  2. 扩容触发条件
    • 当向切片中追加元素(如使用append函数),且当前切片的容量不足以容纳新元素时,就会触发扩容。
  3. 扩容策略
    • 当前容量小于1024时
      • 新容量会变为原来容量的2倍。例如,如果原切片容量为100,当触发扩容时,新容量会变为200。
    • 当前容量大于等于1024时
      • 新容量会变为原来容量的1.25倍。例如,如果原切片容量为1024,触发扩容后新容量变为1024 * 1.25 = 1280。
  4. 内存重新分配和数据迁移
    • 内存重新分配
      • Go语言的运行时系统会在堆上为新的切片分配一块足够大的连续内存空间,新空间的大小由上述扩容策略确定。
    • 数据迁移
      • 一旦新内存分配完成,运行时系统会将原切片中的所有数据逐个复制到新分配的内存空间中。这个过程是逐个元素复制的,复制完成后,原切片的数据和新切片的数据完全相同,只不过新切片有更大的容量来容纳后续可能追加的元素。
    • 旧内存处理
      • 原切片所占用的内存空间会被Go语言的垃圾回收(GC)机制在适当的时候回收,因为原切片的内存已经不再被使用(所有数据已迁移到新切片)。