逃逸分析
难度:⭐⭐ 中等
考点
- 理解栈分配 vs 堆分配
- 哪些操作会导致逃逸
- 如何优化减少堆分配
题目描述
实现多组对比函数,一个会逃逸到堆,一个留在栈上。 通过 benchmark + go test -gcflags="-m" 验证。
函数对1:CreateOnStack vs CreateOnHeap
函数对2:SliceNoEscape vs SliceEscape
函数对3:InterfaceEscape vs NoInterfaceEscape
参考答案(Go)
点击展开参考答案
go
//go:build ignore
package answer
func CreateOnStack() int {
x := 42
return x
}
func CreateOnHeap() *int {
x := 42
return &x // 取地址 → 逃逸
}
func SliceNoEscape() int {
s := [5]int{1, 2, 3, 4, 5} // 数组在栈上
sum := 0
for _, v := range s {
sum += v
}
return sum
}
func SliceEscape() []int {
s := make([]int, 10)
for i := range s {
s[i] = i + 1
}
return s // 返回 slice → 逃逸
}
func SumWithInterface(nums ...interface{}) int {
sum := 0
for _, n := range nums {
if v, ok := n.(int); ok {
sum += v
}
}
return sum
}
func SumDirect(a, b, c int) int {
return a + b + c
}