第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這是 Golang 執(zhí)行多重賦值的方式嗎?

這是 Golang 執(zhí)行多重賦值的方式嗎?

Go
Qyouu 2021-12-20 16:48:47
不久前有人問了一個問題,關(guān)于 Golang 實際上如何在像a, b = b, a.為了回答這個問題,我拿出了我的 Golang 編譯器,戴上了我的思維帽,并為上述問題制作了一個答案。所以問題應(yīng)該是獨立的,所以為了簡潔起見,我的答案被截斷了:要弄清楚編譯器如何生成本機代碼,我們需要查看它生成的匯編代碼,這些代碼由鏈接器轉(zhuǎn)換為機器代碼。我寫了一個小 Go 程序來幫助解決這個問題: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,我找到了這四行,它們對應(yīng)myfunction于 Go 代碼中的前兩行:(注意這是針對我的 64 位機器;輸出會在其他架構(gòu)(如 32 位)上有所不同)0x0028 00040 (swap.go:10) MOVQ    $10, CX         ; var a = 100x002f 00047 (swap.go:10) MOVQ    $5, AX          ; var b = 50x0036 00054 (swap.go:11) MOVQ    CX, "".b+16(SP) ; copy a to *b+160x003b 00059 (swap.go:11) MOVQ    AX, "".a+24(SP) ; copy b to *a+24 查看關(guān)于 asm 的 Golang 文檔,我們可以看到匯編程序使用間接來處理值。當(dāng)程序運行時,CPU 足夠聰明,可以看到發(fā)生了什么,并使用寄存器來避免覆蓋現(xiàn)有值。這是完整的拆解,如果您有興趣。根據(jù)我對(英特爾)x86 組裝的微薄知識,我的 評論獲得了 6 票,我的回答獲得了接受和 3 票。Golang程序集的四行實際上是做什么的?我的回答正確嗎?我問是因為我鏈接的文檔不是很(根本)詳盡。
查看完整描述

2 回答

?
臨摹微笑

TA貢獻1982條經(jīng)驗 獲得超2個贊

a, b := 10, 5

b, a = a, b


0x0028 00040 (swap.go:10) MOVQ    $10, CX         ; CX = 10

0x002f 00047 (swap.go:10) MOVQ    $5, AX          ; AX = 5

0x0036 00054 (swap.go:11) MOVQ    CX, "".b+16(SP) ; b = CX or *(SP+16) = CX

0x003b 00059 (swap.go:11) MOVQ    AX, "".a+24(SP) ; a = AX or *(SP+24) = CX 

CX, AX, 和SP是寄存器。a和b分別是 SP+24 和 SP+16 處堆棧上的變量。


查看完整回答
反對 回復(fù) 2021-12-20
?
開滿天機

TA貢獻1786條經(jīng)驗 獲得超13個贊

它將常量 10 和 5 加載到 CPU 寄存器中,然后將寄存器存儲到為變量a和保留的堆棧位置b。


它相當(dāng)于:


 CX := 10

 AX := 5

 b := CX

 a := AX

請注意,一個不錯的優(yōu)化編譯器應(yīng)該將其優(yōu)化為將常量直接存儲到堆棧位置的代碼:


 b := 10

 a := 5

或者更好的是完全消除變量:


 return []int{5, 10}


查看完整回答
反對 回復(fù) 2021-12-20
  • 2 回答
  • 0 關(guān)注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號