当前位置: 首页 > 知识库问答 >
问题:

片分配在Go复制内存中吗

史懿轩
2023-03-14

用途:我有一个大的缓冲区,我希望有一个指向缓冲区中不同loc的指针数组/片。

我在做什么:

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

我的问题:

  1. 这会复制内存吗?我猜不是,但我找不到任何地方来证实这一点
  2. 确定是否存在内存拷贝的最佳方法/工具是什么

共有2个答案

司马晋
2023-03-14
  1. 没有

Slice只是指向内存lencap
的指针,请参见:为什么我不能在Golang中用`copy()`复制一个Slice?

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]
}

柳宪
2023-03-14

Go切片作为一个结构实现:

src/runtime/slice。转到

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]

见围棋博客:围棋切片:用法和内部,

 类似资料:
  • 我已经在一台具有三个不同端口(例如27018[master]、27019、27020)的机器中进行了复制。我还在一台机器上用两个不同的端口(比如27021、27022)进行了分片。 现在我必须为分片的计算机端口实现复制。我需要为27021和27022实现复制。我怎么能这么做?请帮我解决这个问题。 null

  • Go语言的内置函数 copy() 可以将一个数组切片复制到另一个数组切片中,如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。 copy() 函数的使用格式如下: copy( destSlice, srcSlice []T) int 其中 srcSlice 为数据来源切片,destSlice 为复制的目标(也就是将 srcSlice 复制到 destSlice),目

  • 问题内容: 我在此处的注释中读到,更改列表时执行切片分配具有更高的内存效率。例如, 应该比 因为前者会替换现有列表中的元素,而后者会创建一个新列表并重新绑定到该新列表,从而将旧列表保留在内存中,直到可以对其进行垃圾回收为止。对两者进行基准测试以提高速度,后者则要快一些: 这就是我所期望的,因为重新绑定变量应该比替换列表中的元素更快。但是,我找不到任何支持内存使用声明的官方文档,也不确定如何进行基准

  • 问题内容: 我们在服务器上遇到了几分钟的延迟。它们可能是由“阻止世界”垃圾收集触发的。但是我们使用并发标记和清除GC(-XX:+ UseConcMarkSweepG),因此,我认为,这些暂停是由旧一代的内存碎片触发的。 如何分析老一代的内存碎片?有什么工具吗? 每小时都会发生延迟。大多数时间约为20秒,但有时-几分钟。 问题答案: 在Java文档中查找用于打开GC日志记录的“ java -X …”

  • 问题内容: 这是一篇受此评论启发的帖子,内容涉及如何在CPython中为对象分配内存。最初,这是在创建列表并将其添加到for循环中_以_ 实现列表理解的上下文中。 所以这是我的问题: CPython中有多少个不同的分配器? 每个功能是什么? 什么时候被正式称为?(根据此评论中的内容,列表理解可能不会导致调用, python在启动时会为其分配多少内存? 是否有规则来控制哪些数据结构在此存储器上首先获

  • 我有一个一直在思考的问题。以这个特殊的类为例 假设我有一个B类,它拥有一个使用listOne读取详细信息的方法。要查看数组列表,我需要首先获取列表的大小,以便我的代码知道数组列表何时结束。有两种方法可以做到这一点,一种是 或者我也可以用 在内存和效率方面,哪种方法更好?此外,假设我正在递归地读取一个非常大的数组。为了简单起见,让我们假设递归读取此数组将导致堆栈溢出异常。在这种情况下,第一个方法在理