assembly - 堆栈变量在去?

标签 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 中如何工作的基本概要吗?函数变量会放在堆上吗?

最佳答案

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

你可以使用类似这样的东西对你的代码进行逃逸分析(假设你的文件名是 main.go):

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

关于assembly - 堆栈变量在去?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46247086/

相关文章:

go - 有没有更好的方法来观看 imap 邮箱更新?

macos - 如何解决在 mac m1 中运行 gcc 失败退出状态 1?

assembly - 我可以在现代系统上的汇编中使用 movl 代替 movb 或 movw 吗?

assembly - x86 程序集 : Comparisons (GAS syntax)

assembly - nasm 汇编语言中的 $ 是什么?

sockets - golang net.UDPConn 和 net.TCPConn 线程安全吗??我可以在多线程中读取或写入单个 UDPConn 对象吗?

linux - 没有 %gs 寄存器的 x86 子集 : binary patching code that uses %gs instead of trapping to emulation?

c - 将 unsigned int(通过负数)分配给有符号 long long 时出现意外值

go - 在保留顺序的同时对 slice 进行并发反序列化

go - 在执行并行表测试用例时,如何推迟测试服务器的关闭?