gpt4 book ai didi

memory - Go 如何在 make 或 new 调用中分配内存?

转载 作者:IT王子 更新时间:2023-10-29 00:46:20 27 4
gpt4 key购买 nike

当我使用 make 或 new 调用创建新的 slice 或结构时:

s := make([]int64, 10, 100)
o := new(MyStruct)

Go 通过内存分配系统调用分配了多少内存?它是否预先分配内存,以便后续调用不会触发新的系统调用?

我问这个是因为我需要在我的代码中频繁分配内存。我不确定我是否需要自己实现一个内存分配器,或者我是否可以依赖 Go 来完成这些肮脏的工作。如果 Go 确实预分配内存,我可以自定义分配的 block 大小吗?

我在Go中写了一些实验代码,并在strace下运行代码,但我不明白Go对mmap系统调用做了什么:

mmap(0xc000000000, 65536, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xc000000000
munmap(0xc000000000, 65536) = 0
mmap(NULL, 262144, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efdd1017000
mmap(0xc208000000, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xc208000000
mmap(0xc207ff0000, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xc207ff0000
mmap(0xc000000000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xc000000000
mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efdd1007000
mmap(NULL, 1439992, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efdd0ea7000

最佳答案

在这里您可能患有“过早优化”综合症。语言规范没有说明 make() 分配的内存将如何分配。

例如,符合规范的 Go 实现可能会对执行 make([]foo, ...) 的函数进行彻底分析并证明:

  1. 返回的 slice 值没有超出函数的作用域。
  2. append() 不会在这个 slice 值上调用。
  3. 它没有传递给任何被调用函数的 slice 值。

在这种情况下, slice 的后备存储可能就在堆栈上分配。

当然,我在夸大其词,但同样,语言规范中并未声明其语义。目前有两个成熟的 Go 实现(一个源自 Google,被称为 gcgccgo)还有更多(llvmgo 看起来像有很好的生活机会),他们都有自己的特点。

所以请考虑阅读pprof 和一般的 Go 分析,并分析示例(但真实)代码。

正在搜索 the mailing list对于单词“profile”、“profiling”、“heap AND profile”、“CPU AND profile”和“pprof”将为您提供很多见解。

同时考虑 thisthis .

关于memory - Go 如何在 make 或 new 调用中分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31553048/

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