golang汇编内存分配

时间:2016-09-28 11:55:17

标签: go

//  example1.go

packge main

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

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

// example2.go
packge main

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

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

// example3.go
package main

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

查找汇编代码,看看编译器是非常聪明的选择,但在example2.go为什么不这样做

1 个答案:

答案 0 :(得分:1)

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

* go go go7.7.1 linux / amd64