2016-02-29 141 views
3

我想了解去的內部。請看下面的代碼交換兩個數字golang

a,b := 10,5 
b,a = a,b 

上面的代碼互換2號完全和變成5和B變成10.我無法理解這是如何工作。考慮到代碼的第二行,如果a先分配給b,那麼b將是10.現在如果我們將b賦值給a,那麼不應該也是10。

請幫助我理解它是如何工作的

感謝

+6

編譯器使用寄存器作爲臨時存儲,就像一個臨時變量 – cat

+1

製作成一個可執行這一點,那麼拆解 – cat

+0

或'去工具編譯-S file' – cat

回答

6

TL; DR:反彙編顯示,CPU必須足夠聰明,看到發生了什麼,並使用寄存器來避免覆蓋現有值在記憶中。


這個問題幫助我瞭解了更多關於Golang的知識,所以謝謝!

爲了弄清楚編譯器是如何生成本地代碼的,我們需要看它生成的彙編代碼,它由鏈接器轉變爲機器代碼。

我寫了一個小圍棋程序,以幫助這一點:

package main 

import "fmt" 

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

func myfunction() []int { 
    a, b := 10, 5 
    b, a = a, b 
    return []int{a, b} 
} 

使用go tool compile -S > swap.s,我再CTRL - ˚F「d爲myfunction(這是該名稱的點:易於搜索),和發現這四行,其對應於在Go代碼的myfunction前兩行:(注意,這是我的64位機;輸出將其他architechtures像32位不同)

0x0028 00040 (swap.go:10) MOVQ $10, CX   ; var a = 10 
0x002f 00047 (swap.go:10) MOVQ $5, AX   ; var b = 5 
0x0036 00054 (swap.go:11) MOVQ CX, "".b+16(SP) ; copy a to *b+16 
0x003b 00059 (swap.go:11) MOVQ AX, "".a+24(SP) ; copy b to *a+24 

Go的拆卸對調試非常有幫助:D

看着the Golang docs on asm,我們可以看到彙編程序使用間接方式來調整值。

當程序運行時,CPU足夠聰明,可以看到發生了什麼,並使用寄存器來避免覆蓋現有值。

Here's the full disassembly, if you're interested.