go局部變數的儲存空間是堆還是棧?

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

go局部變數的儲存空間是堆還是棧?

編譯器會自動選擇在棧上還是在堆上分配局部變數的儲存空間,但可能令人驚訝的是,這個選擇並不是由用var還是new聲明變數的方式決定的。

var global *intfunc 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回收這個變數的記憶體空間),雖然這裡用的是new方式。其實在任何時候,你並不需為了編寫正確的代碼而要考慮變數的逃逸行為,要記住的是,逃逸的變數需要額外分配記憶體,同時對效能的最佳化可能會產生細微的影響。

Go語言的自動垃圾收集器對編寫正確的代碼是一個巨大的協助,但也並不是說你完全不用考慮記憶體了。你雖然不需要顯式地分配和釋放記憶體,但是要編寫高效的程式你依然需要瞭解變數的生命週期。例如,如果將指向短生命週期對象的指標儲存到具有長生命週期的對象中,特別是儲存到全域變數時,會阻止對短生命週期對象的記憶體回收(從而可能影響程式的效能)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.