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

  • 相关阅读:
    Runoob-Java:Java 开发环境配置
    公司-科技:JotSpot
    服务-WiKi:WiKi
    国际组织-Java:JCP
    Java:Java 简介
    Runoob-Java:Java 教程
    oracle-ofa
    HTML5 viewport 标签与 CSS3 background-size 属性 使图片完全适应区域内容
    Android studio怎么导入Recycler VIew
    Android studio怎么导入Recycler VIew
  • 原文地址:https://www.cnblogs.com/maji233/p/11048018.html
Copyright © 2011-2022 走看看