// 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/