加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

交换两个数字golang

发布时间:2020-12-16 19:23:04 所属栏目:大数据 来源:网络整理
导读:我想了解go的内部.请考虑以下代码 a,b := 10,5b,a = a,b 上面的代码完美地交换2个数字,a变为5,b变为10.我无法理解这是如何工作的.考虑到第二行代码,如果a首先被分配给b,那么b将是10.现在如果我们将b分配给a,那么也不应该是10. 请帮我理解这是如何工作的 谢谢
我想了解go的内部.请考虑以下代码
a,b := 10,5
b,a = a,b

上面的代码完美地交换2个数字,a变为5,b变为10.我无法理解这是如何工作的.考虑到第二行代码,如果a首先被分配给b,那么b将是10.现在如果我们将b分配给a,那么也不应该是10.

请帮我理解这是如何工作的

谢谢

TL; DR:反汇编表明CPU必须足够聪明才能看到发生了什么,并使用寄存器来避免覆盖内存中的现有值.

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

为了弄清楚编译器如何生成本机代码,我们需要查看它生成的汇编代码,链接器将其转换为机器代码.

我写了一个Go程序来帮助解决这个问题:

package main

import "fmt"

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

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

使用go工具编译-S> swap.s,然后CTRL – F’d为myfunction(这个名称的点:容易搜索),并找到这四行,对应于Go代码中myfunction的前两行:(注意这是对于我的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

查看the Golang docs on asm,我们可以看到汇编程序使用间接来处理值.

当程序运行时,CPU足够聪明,可以看到发生了什么,并使用寄存器来避免覆盖现有值.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读