美文网首页
堆和栈在 变量逃逸 的一些认识

堆和栈在 变量逃逸 的一些认识

作者: 沫明 | 来源:发表于2019-12-23 16:46 被阅读0次

堆(heap):

堆是用于存放进程执行中被动态分配的内存段。它的大小并不固定,可动态扩张或缩减。当进程调用 malloc 等函数分配内存时,新分配的内存就被动态加入到堆上(堆被扩张)。当利用 free 等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

栈(stack):

栈又称堆栈, 用来存放程序暂时创建的局部变量,也就是我们函数的大括号{ }中定义的局部变量。


在程序的编译阶段,编译器会根据实际情况自动选择在栈或者堆上分配局部变量的存储空间,不论使用 var 还是 new 关键字声明变量都不会影响编译器的选择。

var global *int
func f() {
    var x int
    x = 1
    global = &x
}
func g() {
    y := new(int)
    *y = 1
}

(下面能更好的理解变量逃逸)
上述代码中,函数 f 里的变量 x 必须在堆上分配,因为它在函数退出后依然可以通过包一级的 global 变量找到,虽然它是在函数内部定义的。用Go语言的术语说,这个局部变量 x 从函数 f 中逃逸了。

相反,当函数 g 返回时,变量 y 不再被使用,也就是说可以马上被回收的。因此,y 并没有从函数 g 中逃逸,编译器可以选择在栈上分配 *y 的存储空间,也可以选择在堆上分配,然后由Go语言的 GC(垃圾回收机制)回收这个变量的内存空间。

在实际的开发中,并不需要刻意的实现变量的逃逸行为,因为逃逸的变量需要额外分配内存,同时对性能的优化可能会产生细微的影响。

虽然Go语言能够帮助我们完成对内存的分配和释放,但是为了能够开发出高性能的应用我们任然需要了解变量的声明周期。例如,如果将局部变量赋值给全局变量,将会阻止 GC 对这个局部变量的回收,导致不必要的内存占用,从而影响程序的性能。

相关文章

  • 堆和栈在 变量逃逸 的一些认识

    堆(heap): 堆是用于存放进程执行中被动态分配的内存段。它的大小并不固定,可动态扩张或缩减。当进程调用 mal...

  • go-内存机制(1)

    逃逸分析 堆与栈 在go语言中,变量可以存储在栈或者堆之上。如果变量存储在栈之上,那么当这个栈被清理时,对应的栈内...

  • Golang的入门教程(四)

    1: 变量逃逸 堆和栈各有优缺点,该怎么在变成中处理这个问题呢?Go语言将这个过程整合到编译器中,命名为"变量逃逸...

  • go 逃逸分析

    go 逃逸分析 什么是逃逸分析 逃逸分析决定一个变量是分配在堆上还是分配在栈上 原理 逃逸分析这种“骚操作”把变量...

  • JS基础

    堆和栈 栈里面存的是变量和变量对应的值得储存的地址堆里面存的是值

  • java中栈内存和堆内存有什么区别

    java中栈内存和堆内存有什么区别 栈内存和堆内存的区别: 1、栈内存用来存放基本类型的变量和引用变量,堆内存用来...

  • 聊一聊go的内存逃逸分析

    什么是内存逃逸分析 内存逃逸分析是go的编译器在编译期间,根据变量的类型和作用域,确定变量是堆上还是栈上 简单说就...

  • Java内存(栈、堆)

    Java把内存分为两种,一种是栈内存,一种是堆内存 栈内存:在函数中定义的一些基本类型的变量和对象的引用变量都是在...

  • [JAVA] JAVA基础

    一、堆区和栈区 栈中主要存放一些基本类型的变量。(int, short, long, byte, float, d...

  • 9.构造器与垃圾收集器

    堆(heap)——对象、对象的实例变量在堆上栈(stack)——方法调用和局部变量在栈上 实例变量:实例变量是被声...

网友评论

      本文标题:堆和栈在 变量逃逸 的一些认识

      本文链接:https://www.haomeiwen.com/subject/dmttoctx.html