package main
import (
"fmt"
"os"
)
func main() {
var l = test(4)
test(5)
fmt.Fprintf(os.Stdout, "%d\n", *l)
}
func test(v int) *int {
var p = v
return &p
}
在C中,等效代码将打印5,因为第一个堆栈帧中的变量p将被第二个堆栈帧中的相同变量p覆盖。我反汇编代码但是我无法理解它。
#include <stdio.h>
int* test(int v);
int main() {
int* p = test(4);
test(5);
printf("%d\n", *p);
}
int* test(int v) {
int p = v;
return &p;
}
有人可以给我一个关于内存管理如何在Go中运行的基本概要?函数变量是否在堆上?
答案 0 :(得分:1)
有点奇怪的是,我们没有关于逃逸分析的良好官方文件(或者即使它在那里我还没有找到它!)但这里有一些东西我发现有用:http://blog.rocana.com/golang-escape-analysis
您可以使用类似的东西对代码进行转义分析(假设您的文件名是main.go):
go run -gcflags '-m -l' main.go