堆栈变量去了吗?

时间:2017-09-15 20:30:55

标签: assembly go

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中运行的基本概要?函数变量是否在堆上?

1 个答案:

答案 0 :(得分:1)

有点奇怪的是,我们没有关于逃逸分析的良好官方文件(或者即使它在那里我还没有找到它!)但这里有一些东西我发现有用:http://blog.rocana.com/golang-escape-analysis

您可以使用类似的东西对代码进行转义分析(假设您的文件名是main.go):

go run -gcflags '-m -l' main.go