zoukankan      html  css  js  c++  java
  • 初探go的变量交换

    初学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与手写交换在效率上是一致的,仅仅是方便一些。

     
  • 相关阅读:
    链表_单链表(插入删除查询)
    OceanBase架构浅析(一)
    电商商品搜索现状
    ASP.NET MVC 源码分析(二) —— 从 IRouteBuilder认识路由构建
    ASP.NET MVC 源码分析(一)
    RPC框架分析
    RPC简介
    Performance Metrics(性能指标2)
    Performance Metrics(性能指标1)
    Introduction(本书简介)
  • 原文地址:https://www.cnblogs.com/oxzc/p/12386547.html
Copyright © 2011-2022 走看看