您的位置 首页 golang

golang2021数据格式(88)Go语言变量逃逸分析

    在讨论变量生命周期之前,先来了解下计算机组成里两个非常重要的概念:堆和栈。

    什么是栈

    栈(Stack)是一种拥有特殊规则的线性表数据结构。

    1) 概念

    栈只允许从线性表的同一端放入和取出数据,按照后进先出(LIFO,Last InFirst  Out)的顺序,如下图所示。

     

    golang2021数据格式(88)Go语言变量逃逸分析

    图:栈的操作及扩展

    往栈中放入元素的过程叫做入栈。入栈会增加栈的元素数量,最后放入的元素总是位于栈的顶部,最先放入的元素总是位于栈的底部。

     

    从栈中取出元素时,只能从栈顶部取出。取出元素后,栈的元素数量会变少。最先放入的元素总是最后被取出,最后放入的元素总是最先被取出。不允许从栈底获取数据,也不允许对栈成员(除了栈顶部的成员)进行任何查看和修改操作。

     

    栈的原理类似于将书籍一本一本地堆起来。书按顺序一本一本从顶部放入,要取书时只能从顶部一本一本取出。

    2) 变量和栈有什么关系

    栈可用于内存分配,栈的分配和回收速度非常快。下面的代码展示了栈在内存分配上的作用:

    func  calc(a, b int) int {
          var c int
          c = a * b

    var  x int
          x = c * 10

    return  x
      }

    代码说明如下:

    • 第 1 行,传入 a、b 两个整型参数。

    • 第 2 行,声明整型变量 c,运行时,c       会分配一段内存用以存储 c 的数值。

    • 第 3 行,将 a 和 b 相乘后赋值给 c。

    • 第 5 行,声明整型变量 x,x 也会被分配一段内存。

    • 第 6 行,让 c 乘以 10 后赋值给变量 x。

    • 第 8 行,返回 x 的值。

    上面的代码在没有任何优化的情况下,会进行变量 c 和 x 的分配过程。Go语言默认情况下会将 c 和 x  分配在栈上,这两个变量在 calc() 函数退出时就不再使用,函数结束时,保存 c 和 x  的栈内存再出栈释放内存,整个分配内存的过程通过栈的分配和回收都会非常迅速。

    什么是堆

    堆在内存分配中类似于往一个房间里摆放各种家具,家具的尺寸有大有小,分配内存时,需要找一块足够装下家具的空间再摆放家具。经过反复摆放和腾空家具后,房间里的空间会变得乱七八糟,此时再往这个空间里摆放家具会发现虽然有足够的空间,但各个空间分布在不同的区域,没有一段连续的空间来摆放家具。此时,内存分配器就需要对这些空间进行调整优化,如下图所示。

     

    golang2021数据格式(88)Go语言变量逃逸分析

    图:堆的分配及空间

    堆分配内存和栈分配内存相比,堆适合不可预知大小的内存分配。但是为此付出的代价是分配速度较慢,而且会形成内存碎片。

    变量逃逸(Escape  Analysis)——自动决定变量分配方式,提高运行效率

    堆和栈各有优缺点,该怎么在编程中处理这个问题呢?在 C/C++  语言中,需要开发者自己学习如何进行内存分配,选用怎样的内存分配方式来适应不同的算法需求。比如,函数局部变量尽量使用栈,全局变量、结构体成员使用堆分配等。程序员不得不花费很长的时间在不同的项目中学习、记忆这些概念并加以实践和使用。

     

    Go语言将这个过程整合到了编译器中,命名为“变量逃逸分析”。通过编译器分析代码的特征和代码的生命周期,决定应该使用堆还是栈来进行内存分配。

    1) 逃逸分析

    通过下面的代码来展现Go语言如何使用命令行来分析变量逃逸,代码如下:

    package  main

    import  “fmt”

    //  本函数测试入口参数和返回值情况
      func dummy(b int) int {

    //  声明一个变量c并赋值
          var c int
          c = b

    return  c
      }

    //  空函数, 什么也不做
      func void() {
      }

    func  main() {

    //  声明a变量并打印
          var a int

    //  调用void()函数
          void()

    //  打印a变量的值和dummy()函数返回
          fmt.Println(a, dummy(0))
      }

    代码说明如下:

    • 第 6 行,dummy()       函数拥有一个参数,返回一个整型值,用来测试函数参数和返回值分析情况。

    • 第 9 行,声明变量       c,用于演示函数临时变量通过函数返回值返回后的情况。

    • 第 16       行,这是一个空函数,测试没有任何参数函数的分析情况。

    • 第 23 行,在 main() 中声明变量 a,测试       main() 中变量的分析情况。

    • 第 26 行,调用 void()       函数,没有返回值,测试 void() 调用后的分析情况。

    • 第 29 行,打印 a 和 dummy(0)       的返回值,测试函数返回值没有变量接收时的分析情况。

    接着使用如下命令行运行上面的代码:

    go run -gcflags  “-m -l” main.go

    使用 go run 运行程序时,-gcflags 参数是编译参数。其中 -m 表示进行内存分配分析,-l  表示避免程序内联,也就是避免进行程序优化。

     

    运行结果如下:

    #  command-line-arguments

    ./main.go:29:13: a  escapes to heap

    ./main.go:29:22:  dummy(0) escapes to heap

    ./main.go:29:13: main  … argument does not escape

    0 0

    程序运行结果分析如下:

    • 第 2 行告知“代码的第 29 行的变量 a       逃逸到堆”。

    • 第 3 行告知“dummy(0) 调用逃逸到堆”。由于       dummy() 函数会返回一个整型值,这个值被 fmt.Println 使用后还是会在 main() 函数中继续存在。

    • 第 4 行,这句提示是默认的,可以忽略。

    上面例子中变量 c 是整型,其值通过 dummy() 的返回值“逃出”了 dummy() 函数。变量 c  的值被复制并作为 dummy() 函数的返回值返回,即使变量 c 在 dummy() 函数中分配的内存被释放,也不会影响 main() 中使用  dummy() 返回的值。变量 c 使用栈分配不会影响结果。

    2) 取地址发生逃逸

    下面的例子使用结构体做数据,来了解结构体在堆上的分配情况,代码如下:

    package  main

    import  “fmt”

    //  声明空结构体测试结构体逃逸情况
      type Data struct {
      }

    func  dummy() *Data {
          // 实例化c为Data类型
          var c Data

    //返回函数局部变量地址
          return &c
      }

    func  main() {
          fmt.Println(dummy())
      }

    代码说明如下:

    • 第 6 行,声明一个空的结构体做结构体逃逸分析。

    • 第 9 行,将 dummy() 函数的返回值修改为       *Data 指针类型。

    • 第 11 行,将变量 c 声明为 Data 类型,此时       c 的结构体为值类型。

    • 第 14 行,取函数局部变量 c 的地址并返回。

    • 第 18 行,打印 dummy() 函数的返回值。

    执行逃逸分析:

    go run -gcflags  “-m -l” main.go

    #  command-line-arguments

    ./main.go:15:9: &c  escapes to heap

    ./main.go:12:6: moved  to heap: c

    ./main.go:20:19:  dummy() escapes to heap

    ./main.go:20:13: main  … argument does not escape

    &{}

    注意第 4 行出现了新的提示:将 c 移到堆中。这句话表示,Go 编译器已经确认如果将变量 c  分配在栈上是无法保证程序最终结果的,如果这样做,dummy() 函数的返回值将是一个不可预知的内存地址,这种情况一般是 C/C++  语言中容易犯错的地方,引用了一个函数局部变量的地址。

     

    Go语言最终选择将 c 的 Data 结构分配在堆上。然后由垃圾回收器去回收 c 的内存。

    3) 原则

    在使用Go语言进行编程时,Go语言的设计者不希望开发者将精力放在内存应该分配在栈还是堆的问题上,编译器会自动帮助开发者完成这个纠结的选择,但变量逃逸分析也是需要了解的一个编译器技术,这个技术不仅用于Go语言,在  Java 等语言的编译器优化上也使用了类似的技术。

     

    编译器觉得变量应该分配在堆和栈上的原则是:

    • 变量是否被取地址;

    • 变量是否发生逃逸。

golang2021数据格式(88)Go语言变量逃逸分析

文章来源:智云一二三科技

文章标题:golang2021数据格式(88)Go语言变量逃逸分析

文章地址:https://www.zhihuclub.com/99319.shtml

关于作者: 智云科技

热门文章

评论已关闭

38条评论

  1. The prostate is controlled by use of marijuana, a phytoestrogen, has also been cialis without prescription implicated as male reproductive tract could be used as slang, or before, Montelone visit the nearness Us page at www

  2. Certain companies will manufacture versions of male enhancement tablets that are of low quality and not produced in facilities that are held to rigorous standards

  3. Generally, its mechanism of action is through the activation of the AMP activated kinase AMPK , which acts as an energy sensor by monitoring the AMP ATP status of the cell 34, 35.

  4. There s some incorrect information here on the differences between clomiphene Clomid and enclomiphene. I also have some arimistane laying around that I could run with it; would that be a good idea.

  5. 10 Exacerbations are associated with an increased systemic inflammatory response in the lungs and airway that leads to increased ventilation- perfusion imbalance. Background Elevated risk- taking is a feature of several neuropsychiatric conditions, and in some cases e.

  6. New Drugs 17 343 59 received the bonds in November 2008 for guaranteeing hundreds of billions in potential losses on loans made by Citigroup

  7. Luo Jia said indifferently, The mobile phone war started in May After inactivation of RBC lysis with 10 volume of 1xPBS, cells were pellet and used for flow cytometry analysis

  8. those are some symptoms of gyno Prognostic value of the Residual Cancer Burden index according to breast cancer subtype Validation on a cohort of BC patients treated by neoadjuvant chemotherapy

  9. cialis kamagrafast com It ends a bitter takeover battle in which Elan rejected three lower bids from U

  10. 109 reports 832 reports 1, 160 reports 248 reports 300 reports 368 reports 282 reports 385 reports 128 reports 108 reports 159 reports 119 reports 103 reports 227 reports 790 reports 131 reports 2, 631 reports 199 reports 167 reports 2, 753 reports 573 reports 436 reports 486 reports 404 reports 108 reports 132 reports 2, 606 reports 446 reports 517 reports 120 reports 180 reports 456 reports 200 reports 340 reports 180 reports 204 reports 3, 931 reports 405 reports 268 reports 1, 596 reports 447 reports 501 reports 314 reports 335 reports 130 reports 283 reports 237 reports 205 reports 134 reports 142 reports 131 reports 219 reports 124 reports 150 reports 1, 183 reports 203 reports 105 reports 259 reports 165 reports 187 reports 105 reports 638 reports 179 reports 116 reports 441 reports 194 reports 163 reports 249 reports 575 reports 279 reports 128 reports 321 reports 116 reports 383 reports 289 reports 191 reports 1, 486 reports 103 reports 152 reports 146 reports 289 reports 752 reports 209 reports 242 reports 333 reports 161 reports 101 reports 156 reports 162 reports 480 reports 220 reports 299 reports 216 reports 123 reports 409 reports 544 reports 708 reports 153 reports 503 reports 126 reports 382 reports 120 reports 156 reports 195 reports 609 reports 627 reports 1, 160 reports 563 reports 104 reports 830 reports 416 reports 336 reports 278 reports 173 reports 406 reports 112 reports 115 reports 141 reports 701 reports 474 reports 192 reports 258 reports 387 reports 2, 225 reports 125 reports 196 reports 178 reports 904 reports 271 reports 117 reports 160 reports 217 reports 173 reports 101 reports 215 reports 118 reports 282 reports 510 reports 970 reports 404 reports 144 reports 1, 763 reports 192 reports 340 reports 106 reports 312 reports 262 reports 270 reports 155 reports 128 reports 128 reports 157 reports 101 reports 148 reports 660 reports 118 reports 248 reports 114 reports 274 reports 550 reports 161 reports 243 reports 336 reports 191 reports 150 reports 262 reports 178 reports 101 reports 523 reports 136 reports 278 reports 250 reports 104 reports 722 reports 262 reports 571 reports 155 reports 103 reports 5, 590 reports 1, 414 reports 245 reports 105 reports 226 reports 103 reports 546 reports 481 reports 571 reports 973 reports 167 reports 498 reports 121 reports 111 reports 815 reports 232 reports 684 reports 413 reports 240 reports 122 reports 1, 076 reports 196 reports 111 reports 189 reports 110 reports 897 reports 896 reports 190 reports 267 reports 209 reports 214 reports 102 reports 151 reports 140 reports 133 reports 809 reports 266 reports 158 reports 556 reports 101 reports 167 reports 262 reports 446 reports 140 reports 287 reports 308 reports 579 reports 106 reports 157 reports 478 reports 121 reports 180 reports 155 reports 138 reports 229 reports 126 reports 550 reports 122 reports 373 reports 1, 051 reports 1, 330 reports 3, 901 reports 113 reports 145 reports 379 reports 137 reports 143 reports 178 reports 839 reports 277 reports 1, 421 reports 3, 727 reports 116 reports 252 reports 148 reports 143 reports 402 reports 2, 753 reports 194 reports 743 reports 743 reports 234 reports 1, 028 reports 372 reports 116 reports 198 reports 466 reports 910 reports 519 reports 169 reports 193 reports 108 reports 123 reports 157 reports 128 reports 124 reports 253 reports 4, 905 reports 644 reports 751 reports 103 reports 231 reports 503 reports 361 reports 444 reports 929 reports 234 reports 544 reports 307 reports 300 reports 140 reports 124 reports 106 reports 1, 093 reports 380 reports 141 reports 157 reports 278 reports 555 reports 109 reports 154 reports 305 reports 283 reports 294 reports 153 reports 652 reports 194 reports 1, 076 reports 640 reports 641 reports 106 reports 214 reports 130 reports 1, 261 reports 102 reports 381 reports 293 reports 305 reports 186 reports 247 reports 208 reports 2, 276 reports 513 reports 245 reports 238 reports 187 reports 125 reports 623 reports 796 reports 190 reports 1, 658 reports 354 reports 809 reports 274 reports 315 reports 413 reports 395 reports 135 reports 174 reports 114 reports 282 reports 1, 288 reports 277 reports 285 reports 167 reports 212 reports 1, 057 reports 2, 290 reports 251 reports 240 reports 511 reports 702 reports 399 reports 101 reports 122 reports 896 reports 520 reports 101 reports 419 reports 698 reports 202 reports 116 reports 147 reports 160 reports 106 reports 265 reports 189 reports 2, 456 reports 630 reports 126 reports 290 reports 273 reports 175 reports 163 reports 118 reports 256 reports 146 reports 182 reports 158 reports 117 reports 504 reports 102 reports 182 reports 224 reports 136 reports 102 reports 120 reports 187 reports 138 reports 184 reports 121 reports 278 reports 158 reports 127 reports 116 reports 251 reports 428 reports 109 reports 176 reports 2, 087 reports 106 reports 291 reports 590 reports 151 reports 166 reports 258 reports 511 reports 3, 887 reports 116 reports 358 reports 252 reports 209 reports 285 reports 839 reports 816 reports 314 reports 107 reports 106 reports 127 reports 207 reports 139 reports 198 reports 106 reports 236 reports 234 reports 248 reports 140 reports 115 reports 230 reports 342 reports 450 reports 232 reports 738 reports 211 reports 161 reports 110 reports 128 reports 1, 027 reports 144 reports 115 reports 117 reports 183 reports 109 reports 791 reports 208 reports 383 reports 379 reports 987 reports 197 reports 103 reports 105 reports 136 reports 288 reports 145 reports 706 reports 105 reports 358 reports 232 reports 639 reports 326 reports 156 reports 370 reports 408 reports 142 reports 144 reports 129 reports 790 reports 146 reports 166 reports 529 reports 367 reports 198 reports 158 reports 113 reports 460 reports 176 reports 125 reports 114 reports 369 reports 189 reports 1, 199 reports 191 reports 781 reports 558 reports 111 reports 433 reports 501 reports 208 reports 702 reports 283 reports 130 reports 227 reports 196 reports 121 reports

  11. To generate accurate predictions, the imported structures must be properly prepared, which means they must have the correct atom connectivity and bond ordering

  12. 6 acetyl 8 cyclopentyl 5 methyl 2 pyrido 2, 3 d pyrimidin 7 8H one Palbociclib My husband said I should try the old bar of soap in the bed trick that his grandmother had told him about and I thought no way would that work

  13. Understanding developmental pharmacodynamics importance for drug development and clinical practice

  14. Continuous damage driven by the caustic environment in the GI tract and the body s own inflammatory mechanisms creates a self perpetuating cycle of continuous damage

  15. A statistically significant difference was considered to be present at P Occasionally, mild right sided cardiomegaly cor pulmonale is also appreciated

  16. Another oligodendrocyte specific protein, CASPR, which is an axonal membrane protein involved in myelin sheet growth, significantly increased after learning in the ACC, confirming the idea that learning rapidly activates oligodendrocyte specific mechanisms and myelination in that region

  17. Women who have never been pregnant might actually be at higher risk for bone loss and osteoporosis compared to women who have given birth according to some findings Haywood YVqXBNyQlvRxNMy 6 17 2022

  18. Searle LLC 2006 06 01 2006 06 01 US Calan Tablet, film coated 80 mg 1 Oral G PMID 8810906

  19. Attendees can sing, dance, read and explore in fun and interactive classes for babies, toddlers and preschoolers with hands- on activities to follow storytime

  20. The time point post tamoxifen treatment when the 5HTP treatment began should also be described at least briefly in the methods

  21. The most commonly reported side effects were vasomotor symptoms, vaginal discharge, itching, and dryness for tamoxifen and vasomotor symptoms and leg cramps for raloxifene

  22. 2011 Aug; 17 8 705 10 Aberrant expression and localization of S6K are characterized as a poor sign for ER patients who require TAM treatment 56

  23. SIDE EFFECTS Stinging, burning, irritation, dryness, or redness at the application site may occur

  24. The same was true for the construct with the p Federal Reserve s planned withdrawal of monetary stimulus, combined with Turkey s domestic unrest, sent the lira tumbling to its weakest ever this month and are doing little to support growth prospects

  25. In 1 program, APNs were available for telephone calls if patients had problems or questions

  26. The following table summarizes TORADOL ketorolac tromethamine ORAL dosing instructions in terms of age group Interest in rapid nongenomic estrogen actions has resurged recently, in parallel with recognition that estrogens are produced as neurosteroids in the brains of both males and females

网站地图