在Go复制内存中执行切片分配

时间:2019-03-18 18:49:01

标签: go

目的:我有一个很大的缓冲区,并且我想有一个指向缓冲区中不同位置的指针数组/切片。

我在做什么:

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

我的问题:

  1. 此副本存储器会吗?我的猜测不是,但是我找不到任何地方可以确认这一点。
  2. 找出是否有内存副本的最佳方法/工具是什么?

2 个答案:

答案 0 :(得分:3)

Go slice被实现为一个结构:

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

输出:

[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

答案 1 :(得分:2)

切片只是指向内存+ lencap的指针
参见:Why can not I duplicate a slice with `copy()` in Golang?


  1. 像这样:
package main

import (
    "fmt"
)

func main() {
    bigBuf := []byte{1, 2, 3, 4, 5}

    datPtrs := make([][]byte, 2)
    for i := 0; i < 2; i++ {
        datPtrs[i] = bigBuf[i : i+1]
    }
    fmt.Println(bigBuf) // [1 2 3 4 5]
    datPtrs[0][0] = 10
    fmt.Println(bigBuf) // [10 2 3 4 5]

    datPtrs[1][0] = 20
    fmt.Println(bigBuf) // [10 20 3 4 5]
}

相关问题