我使用`go version go1.17.2 linux/amd64` 编写了下面的程序探究Go slice的扩容机制:
```go
package main
import "fmt"
func main() {
s := []int{1, 2}
s = append(s, 3, 4, 5)
fmt.Printf("%d %d", len(s), cap(s))
fmt.Println()
s = append(s, 6, 7, 8)
fmt.Printf("%d %d", len(s), cap(s))
fmt.Println()
}
```
程序的输出是
![截屏2021-11-20 下午9.18.02.png](https://static.studygolang.com/211120/b5f8bdd61e624cf2127a7f7e39745330.png)
而如果是在1024的限度内指数增长应该是[5, 8], 但是这里的cap为什么是6?
如果
```
s := []int{1, 2}
s = append(s, 3)
s = append(s, 4)
s = append(s, 5)
```
这样得到的结果的cap是8
#1
更多评论
2楼 <a href="/user/YanDaojiang" title="@YanDaojiang">@YanDaojiang</a> 查了下,和内存对齐有关。
正常需要5Byte,对齐后占用的cap为6Bytes
```
// class bytes/obj bytes/span objects tail waste max waste
// 1 8 8192 1024 0 87.50%
// 2 16 8192 512 0 43.75%
// 3 24 8192 341 8 29.24%
// 4 32 8192 256 0 21.88%
// 5 48 8192 170 32 31.52%
// 6 64 8192 128 0 23.44%
```
#3