gpt4 book ai didi

go - 交换两个数字 golang

转载 作者:IT老高 更新时间:2023-10-28 13:06:58 24 4
gpt4 key购买 nike

我正在尝试了解 Go 的内部结构。考虑以下代码

a,b := 10,5
b,a = a,b

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

请帮助我了解这是如何工作的

谢谢

最佳答案

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


这个问题帮助我了解了更多关于 Golang 的知识,非常感谢!

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

我写了一个小 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(这就是该名称:易于搜索),并找到了这四行,它们对应于 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.

关于go - 交换两个数字 golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35707222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com