• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

初探go的变量交换

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

初学go,使用 Go 的“多重赋值”特性可以两个变量交换即可写为,a,b = b,a。便想查看go编译器是如何实现的。

使用go tool compile -N -l -S main.go得到汇编代码:


0x000e 00014 (main.go:5) MOVQ $300, "".a+8(SP)
0x0017 00023 (main.go:6) MOVQ $500, "".b(SP)
0x001f 00031 (main.go:7) MOVQ "".a+8(SP), AX
0x0024 00036 (main.go:7) MOVQ AX, ""..autotmp_2+16(SP)
0x0029 00041 (main.go:7) MOVQ "".b(SP), AX
0x002d 00045 (main.go:7) MOVQ AX, "".a+8(SP)
0x0032 00050 (main.go:7) MOVQ ""..autotmp_2+16(SP), AX
0x0037 00055 (main.go:7) MOVQ AX, "".b(SP)
红色字为交换部分,通过使用临时变量来存储实现。

使用

c=a
a=b
b=c
代码手动第三个变量来实现交换的汇编代码为:

0x000e 00014 (main.go:5) MOVQ $300, "".a+16(SP)
0x0017 00023 (main.go:6) MOVQ $500, "".b+8(SP)
0x0020 00032 (main.go:7) MOVQ $0, "".c(SP)
0x0028 00040 (main.go:8) MOVQ "".a+16(SP), AX
0x002d 00045 (main.go:8) MOVQ AX, "".c(SP)
0x0031 00049 (main.go:9) MOVQ "".b+8(SP), AX
0x0036 00054 (main.go:9) MOVQ AX, "".a+16(SP)
0x003b 00059 (main.go:10) MOVQ "".c(SP), AX
0x003f 00063 (main.go:10) MOVQ AX, "".b+8(SP)

可以看出,使用a,b=b,a与手写交换在效率上是一致的,仅仅是方便一些。

 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go:testing.T与*testing.B发布时间:2022-07-10
下一篇:
[GO]给导入包起别名发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap