zoukankan      html  css  js  c++  java
  • go语言变量生命周期

    关键点

    • 减少局部变量 赋值 给 全局变量的情况,因为此时情况下,会导致局部变量 分配到 堆中,增加gc
    • 当创建的变量的内存大小不定的时候,会分配给
      • 如map,切片,channel等,或者分配的内存超过栈的大小,也会分配到堆中,
    • 如一个切片分配了2000个字节大小;即也就是不确定内存大小编译器就会分配到堆中

    • 变量的生命周期 可以 理解 成 全局变量、局部变量、形参、返回值的作用域

    变量的生命周期指的是在程序运行期间变量有效存在的时间间隔

    变量的生命周期与变量的作用域有着不可分割的联系:

    • 全局变量:它的生命周期和整个程序的运行周期是一致的;
    • 局部变量:它的生命周期则是动态的,从创建这个变量的声明语句开始,到这个变量不再被引用为止;
    • 形式参数函数返回值:它们都属于局部变量,在函数被调用的时候创建,函数调用结束后被销毁
    for t := 0.0; t < cycles*2*math.Pi; t += res {
        x := math.Sin(t)
        y := math.Sin(t*freq + phase)
        img.SetColorIndex(
            size+int(x*size+0.5), size+int(y*size+0.5),
            blackIndex, // 最后插入的逗号不会导致编译错误,这是Go编译器的一个特性
        )               // 小括号另起一行缩进,和大括号的风格保存一致
    }
    

    上面代码中,在每次循环的开始会创建临时变量 t,然后在每次循环迭代中创建临时变量 x 和 y。临时变量 x、y 存放在栈中,随着函数执行结束(执行遇到最后一个}),释放其内存。

    栈的概念在上一节《变量逃逸》中介绍过,它和堆的区别在于:

    • 堆(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 对这个局部变量回收,导致不必要的内存占用,从而影响程序的性能



    转载
    链接:https://www.jianshu.com/p/a98a9f610cc2
    来源:简书

  • 相关阅读:
    c#将 1, 2, ..., 9共 9 个数字分成 3 组
    信息学院本科生创新项目总结
    Element-ui的使用
    fastmock接口管理
    mock安装与使用
    开闭原则
    里氏替换原则
    依赖倒置原则
    接口隔离原则
    单一职责原则
  • 原文地址:https://www.cnblogs.com/beilong/p/14601245.html
Copyright © 2011-2022 走看看