【发布时间】:2017-11-16 13:45:10
【问题描述】:
我了解将高级语言代码转换为机器语言或可执行代码涉及三个步骤,即编译、汇编和链接。
根据 go docs go tool compile 执行以下操作 -
It then writes a single object file named for the basename of the first source file with a .o suffix
因此,最终的目标文件必须包含每个文件的机器语言代码(在编译和汇编运行之后)。如果我在 go 文件上传递 go tool compile -S,它显示汇编语言 go 生成。
之后,当我在目标文件上运行 go tool link 时,它必须链接所有需要的目标文件(如果有多个),然后生成最终的机器语言代码(基于 GOOS 和 GOARCH)。它生成一个文件a.out
这里有几个基本问题 -
我如何知道哪些变量以及何时将在堆栈和堆中分配内存?如果我为一台机器生成可执行文件并在具有不同架构的另一台机器上运行,这有关系吗?
我的测试程序
package main
func f(a *int, b *int) *int {
var c = (*a + *b);
var d = c;
return &d;
}
func main() {
var a = 2;
var b = 6;
f(&a,&b);
}
go tool compile -m -l test.go
的结果test.go:6: moved to heap: d
test.go:7: &d escapes to heap
test.go:3: f a does not escape
test.go:3: f b does not escape
test.go:14: main &a does not escape
test.go:14: main &b does not escape
【问题讨论】:
-
您可以确切地看到 Go 工具对
-x标志的作用。内存分配当然是在运行时。您可以通过打印逃逸分析输出来查看堆栈与堆的区别。 -
内存分配是指某个变量将被分配堆内存或堆栈内存。我在哪里看到的?
-
哦,在编译器优化输出中;
-m -
谢谢@JimB 我做到了并粘贴了上面的结果。