gpt4 book ai didi

go - Go中的 slice 分配是否复制内存

转载 作者:IT王子 更新时间:2023-10-29 01:51:48 25 4
gpt4 key购买 nike

目的:我有一个大缓冲区,我希望有一个指针数组/slice 指向缓冲区中的不同位置。

我在做什么:

datPtrs := make([][]byte, n)
for i:=0; i<n; i++{
datPtrs[i] = bigBuf[i*m:(i+1)*m]
}

我的问题:

  1. 这会复制内存吗?我的猜测不是,但我找不到任何地方可以证实这一点。
  2. 查明是否存在内存复制的最佳方法/工具是什么?

最佳答案

Go slice 被实现为一个结构:

src/runtime/slice.go:

type slice struct {
array unsafe.Pointer
len int
cap int
}

您正在分配/复制 slice 结构,它不会复制底层数组,只会复制其指针。


一个简单的例子:

package main

import (
"fmt"
)

func main() {
buf := make([]byte, 8)
for i := range buf {
buf[i] = byte(i)
}
sub := buf[1:3]
fmt.Println(buf)
fmt.Println(sub)
for i := range sub {
sub[i] += 43
}
fmt.Println(buf)
fmt.Println(sub)
}

Playground :https://play.golang.org/p/4OzPwuNmUlY

输出:

[0 1 2 3 4 5 6 7]
[1 2]
[0 44 45 3 4 5 6 7]
[44 45]

参见 The Go Blog: Go Slices: usage and internals ,

关于go - Go中的 slice 分配是否复制内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55228174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com