栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

交换两个数字golang

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

交换两个数字golang

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


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

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

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

package mainimport "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
进行查找
myfunction
(这是该名称的要点:易于搜索),并找到这四行代码,它们对应
myfunction
于Go代码中的前两行:(请注意,这是我的64位计算机;在其他架构(例如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

Go的反汇编对调试很有帮助:D

查看asm上的Golang文档,我们可以看到汇编器使用间接来处理值。

程序运行时,CPU足够聪明,可以看到正在发生的事情,并使用寄存器来避免覆盖现有值。

如果您有兴趣,这里是完整的拆卸说明。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/436257.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号