目的:我有一个大缓冲区,我想要一个指向缓冲区中不同位置的指针数组/切片。
我在做什么:
datPtrs := make([][]byte, n)
for i:=0; i<n; i++{
datPtrs[i] = bigBuf[i*m:(i+1)*m]
}
我的问题:
- 这会复制记忆吗?我的猜测不是,但我找不到任何地方可以证实这一点。
- 找出是否存在内存复制的最佳方法/工具是什么?
Go 切片被实现为一个结构体:
src/runtime/slice.go
:
type slice struct {
array unsafe.Pointer
len int
cap int
}
您正在分配/复制切片结构,它不复制底层数组,仅复制其指针。
一个简单的例子:
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)
}
操场:https://play.golang.org/p/4OzPwuNmUlY https://play.golang.org/p/4OzPwuNmUlY
Output:
[0 1 2 3 4 5 6 7]
[1 2]
[0 44 45 3 4 5 6 7]
[44 45]
See Go 博客:Go Slices:用法和内部结构 https://blog.golang.org/go-slices-usage-and-internals,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)