上QQ阅读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)函数。确定内存是否在堆上分配的示例代码如下。
$ 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)