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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

Go
Qyouu 2021-12-20 16:48:47
不久前有人問(wèn)了一個(gè)問(wèn)題,關(guān)于 Golang 實(shí)際上如何在像a, b = b, a.為了回答這個(gè)問(wèn)題,我拿出了我的 Golang 編譯器,戴上了我的思維帽,并為上述問(wèn)題制作了一個(gè)答案。所以問(wèn)題應(yīng)該是獨(dú)立的,所以為了簡(jiǎn)潔起見(jiàn),我的答案被截?cái)嗔耍阂宄幾g器如何生成本機(jī)代碼,我們需要查看它生成的匯編代碼,這些代碼由鏈接器轉(zhuǎn)換為機(jī)器代碼。我寫(xiě)了一個(gè)小 Go 程序來(lái)幫助解決這個(gè)問(wèn)題: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,我找到了這四行,它們對(duì)應(yīng)myfunction于 Go 代碼中的前兩行:(注意這是針對(duì)我的 64 位機(jī)器;輸出會(huì)在其他架構(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 文檔,我們可以看到匯編程序使用間接來(lái)處理值。當(dāng)程序運(yùn)行時(shí),CPU 足夠聰明,可以看到發(fā)生了什么,并使用寄存器來(lái)避免覆蓋現(xiàn)有值。這是完整的拆解,如果您有興趣。根據(jù)我對(duì)(英特爾)x86 組裝的微薄知識(shí),我的 評(píng)論獲得了 6 票,我的回答獲得了接受和 3 票。Golang程序集的四行實(shí)際上是做什么的?我的回答正確嗎?我問(wèn)是因?yàn)槲益溄拥奈臋n不是很(根本)詳盡。
查看完整描述

2 回答

?
臨摹微笑

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊

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 處堆棧上的變量。


查看完整回答
反對(duì) 回復(fù) 2021-12-20
?
開(kāi)滿天機(jī)

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超13個(gè)贊

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


它相當(dāng)于:


 CX := 10

 AX := 5

 b := CX

 a := AX

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


 b := 10

 a := 5

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


 return []int{5, 10}


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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