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

     
  • 相关阅读:
    redis-mysql连接池
    Java并发编程原理
    利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件
    Tomcat 启动图解
    JVM
    Java中的Exception
    Java 设计模式六原则及23中常用设计模式
    Jquery15 插件
    Jquery14 工具函数
    Jquery13 Ajax 进阶
  • 原文地址:https://www.cnblogs.com/oxzc/p/12386547.html
Copyright © 2011-2022 走看看