zoukankan      html  css  js  c++  java
  • Golang中变量的分配位置是堆or栈

           我怎么知道一个变量是分配在堆上还是栈上?

           正确的观点是,你不需要知道。go语言中的每一个变量,它的生命周期和引用它的周期一样长。该语言的语义和实现时选择的存储位置,是没有关系的。

           在编写高效率的程序时,存储位置的确会有影响。如果可以,go语言编译器将会分配函数的局部变量到函数的栈帧上。然而,如果编译器不能证实局部变量在函数返回后,不会再被引用,编译器将必须分配该变量到垃圾回收堆上,以避免出现悬挂指针错误。如果一个局部变量非常大,那么存储在堆上比存储在栈上也更加合理。

           在当前的编译器里,如果一个变量的地址被调用了,这个变量将会候选分配在堆上。然而,一个基本转义分析会识别一些情况。在这些情况里,变量不会存活到函数返回,这些变量将分配到栈上。

    例如下面这个函数是正确的,Go语言中没有C++中的构造函数,对象的创建一般交给一个全局的创建函数来完成:

    func NewRect(x, y, width, height float64) *Rect {

    return &Rect{x, y, width, height}

    }

    注意,这里与C/C++不同的是,返回一个局部变量的地址在Go语言中是绝对没有问题的;变量关联的存储在函数返回之后依然存在。

    更直接的说,在Go语言中,如果一个局部变量在函数返回后仍然被使用,这个变量会从heap,而不是stack中分配内存。

    结论:

    Go 编译器自行决定变量分配在堆栈或堆上,以保证程序的正确性。参考https://blog.csdn.net/guyan0319/article/details/85236313

  • 相关阅读:
    svn备份
    Java Web开发引用包的方法
    nucht1.2二次开发增量采集
    程序集信息设置.net
    lucene的基本查询及lucene3.0.1API
    Asp.net网站部署
    C语言面试算法题(一)
    面试题
    C语言面试算法题(二)
    C++的IO流的函数
  • 原文地址:https://www.cnblogs.com/maji233/p/11048018.html
Copyright © 2011-2022 走看看