繁体   English   中英

golang assemble 用于内存分配

[英]golang assemble for memory allocation

//  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 = 1024runtime.makeslice调用就会消失。 似乎 Go 编译器*目前无法推断出cap不会变异,即值不会改变。 正如你所说; 在最后一个例子中, a在编译时被评估为 1000。

* go1.7.1 linux/amd64 版本

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM