Skip to content

逃逸分析 ​

难度:⭐⭐ 中等 ​

考点 ​

  • 理解栈分配 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
}

持续学习,持续构建。