golang assemble 内存分配

标签 go

//  example1.go

packge main

func main() {
    s := make([]byte, 1024, 1024)
   _ = s
}

s 将在堆栈中分配,查找汇编代码不会调用 runtime.makeslice

// example2.go
packge main

func main() {
    cap := 1024
    s := make([]byte, 1024, cap)
    _ = s
}

s 将在堆中分配并查找汇编代码有 runtime.makeslice 为什么这个???

// example3.go
package main

func main() {
    a := 100
    if a>1 {
        a = 1000
    }
    b := interface{}(a)
    _ = b
}

查找汇编代码并看到编译器非常聪明地选择了它但是在 example2.go 中为什么不这样做

最佳答案

我认为这是您的 cap 变量的可变性质 - 如果您将其更改为 const cap = 1024 runtime.makeslice 调用将消失.似乎 Go 编译器* 目前无法推断 cap 不会发生变异,即值不会改变。正如你所说;在最后一个示例中,a 在编译时被评估为 1000。

* go 版本 go1.7.1 linux/amd64

关于golang assemble 内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39746739/

相关文章:

go - 堆叠写入器和 zlib.writer 的校验和错误

sql - 为什么QueryRow()。Scan()在表中不为空时返回空字符串?

mysql - 在 mysql 中使用 gorm 插入类型 []byte 引发 "Error 1241: Operand should contain 1 columns(s)"

Golang 非结构类型指针接收器

go - 如何在golang终端打印时禁用键盘

go - 处理超时并收听 channel

amazon-web-services - AWS CodeBuild golang 构建失败

go - Go io.Pipe 的缓冲版本

去安装。执行自定义操作

amazon-web-services - 无法以编程方式调用 AWS lambda