为了账号安全,请及时绑定邮箱和手机立即绑定

交换两个数字 golang

交换两个数字 golang

Go
隔江千里 2021-12-20 10:40:21
我试图了解 go 的内部结构。考虑以下代码a,b := 10,5b,a = a,b上面的代码完美地交换了 2 个数字,a 变为 5,b 变为 10。我无法理解这是如何工作的。考虑在第二行代码中,如果先将 a 分配给 b,那么 b 将是 10。现在如果我们将 b 分配给 a,那么 a 也不应该是 10。请帮助我了解这是如何工作的
查看完整描述

1 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

反汇编表明 CPU 必须足够聪明才能看到正在发生的事情并使用寄存器来避免覆盖内存中的现有值。


这个问题让我对Golang有了更多的了解,谢谢!


要弄清楚编译器如何生成本机代码,我们需要查看它生成的汇编代码,这些代码由链接器转换为机器代码。


我写了一个小 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,然后我CTRL - F'd for myfunction(这是该名称的重点:易于搜索),并找到了这四行,它们对应myfunction于 Go 代码中的前两行:(注意这是针对我的 64 位机器;输出将在其他架构(如 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


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 234 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号