购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.6.3 反汇编的查看示例

利用反汇编可以查看映射被转换为哪种runtime函数,也可以确定内存是否在堆上分配。

1.查看映射被转换为哪种runtime函数

先使用Go语言编写一段包含映射(map)初始化的代码。

package main
 
import "fmt"
 
func main() {
        var a = map[int]int{}
        a[1] = 1
        fmt.Println(a)
}

接着通过前面提到的go tool compile命令将Go代码编译成汇编代码,这段代码初始化时调用了runtime.makemap_small(SB)函数。如果想看映射被转换为哪种runtime函数,就去源码src/runtime中寻找makemap_small的相关定义,示例代码如下。

$ go tool compile -S map.go | grep 'map.go:6'
0x0014 00020 (map.go:6) PCDATA  $1, $0
0x0014 00020 (map.go:6) CALL    runtime.makemap_small(SB)
0x0019 00025 (map.go:6) MOVQ    AX, "".a+40(SP)
2.确定内存是否在堆上分配

先使用Go语言编写一段涉及内存分配的示例代码。

package main
 
import "fmt"
 
func main() {
        var a = new([]int)
        fmt.Println(a)
}

内存是否在堆上分配,取决于初始化时是否调用了runtime.newobject(SB)函数。确定内存是否在堆上分配的示例代码如下。 2FgcGzPQaFc9vfOg17DD1WitdBiiCTs6oH9dgQI0mgZdwDpHRC0q4VQsEjqrQ2/x

$ go tool compile -S heap.go|grep 'heap.go:6' 
0x0014 00020 (heap.go:6)       LEAQ    type.[]int(SB), AX
0x001b 00027 (heap.go:6)       PCDATA  $1, $0
0x001b 00027 (heap.go:6)       NOP
0x0020 00032 (heap.go:6)       CALL    runtime.newobject(SB)
点击中间区域
呼出菜单
上一章
目录
下一章
×