go内存逃逸
逃逸分析
go在编译时确定是否逃逸,逃逸分析是编译器决定变量分配到栈上还是堆上的一种行为。
查看逃逸分析日志:go build -gcflags=-m
其中,-m打印出逃逸分析的优化策略。
指针逃逸
函数局部变量优先分配到栈上。
如果编译器不能确保变量在函数return之后不再被引用,那么编译器就会将变量分配到堆上。
如果一个局部变量非常大,那么它会被分配到堆上。
函数传递指针比传值效率高吗?
传递指针可以减少底层值的拷贝。如果拷贝的数据量小,那么指针传递会产生逃逸,使用堆,增加GC负担,所以传递指针不一定是高效的。
package main type A struct { a int } func getA() *A { s := new(A) s.a = 10 return s } func main() { getA() }
栈空间不足逃逸
当栈空间不足以存放当前对象或无法判断当前切片长度时会将对象分配到堆中。
package main func main() { s := make([]int, 10000, 10000) for i, _ := range s { s[i] = i } }
动态类型逃逸
函数参数是interface类型,编译时很难确定参数的具体类型,会产生逃逸。
func Print(a ...interface{}) (n int, err error) func Println(a ...interface{}) (n int, err error)
package main import "fmt" func main() { fmt.Print("a") fmt.Println("b") }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2022-01-21 k8s https证书认证