我想了解去的內部。請看下面的代碼交換兩個數字golang
a,b := 10,5
b,a = a,b
上面的代碼互換2號完全和變成5和B變成10.我無法理解這是如何工作。考慮到代碼的第二行,如果a先分配給b,那麼b將是10.現在如果我們將b賦值給a,那麼不應該也是10。
請幫助我理解它是如何工作的
感謝
我想了解去的內部。請看下面的代碼交換兩個數字golang
a,b := 10,5
b,a = a,b
上面的代碼互換2號完全和變成5和B變成10.我無法理解這是如何工作。考慮到代碼的第二行,如果a先分配給b,那麼b將是10.現在如果我們將b賦值給a,那麼不應該也是10。
請幫助我理解它是如何工作的
感謝
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足夠聰明,可以看到發生了什麼,並使用寄存器來避免覆蓋現有值。
編譯器使用寄存器作爲臨時存儲,就像一個臨時變量 – cat
製作成一個可執行這一點,那麼拆解 – cat
或'去工具編譯-S file' – cat