加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift实现尾调用优化?和在相互递归的情况下?

发布时间:2020-12-14 06:07:38 所属栏目:百科 来源:网络整理
导读:特别是如果我有以下代码: func sum(n: Int,acc: Int) - Int { if n == 0 { return acc } else { return sum(n - 1,acc + n) }} 将Swift编译器优化到一个循环?在下面更有趣的情况下是这样吗? func isOdd(n: Int) - Bool { if n == 0 { return false; } els
特别是如果我有以下代码:
func sum(n: Int,acc: Int) -> Int {
  if n == 0 { return acc }
  else { return sum(n - 1,acc + n) }
}

将Swift编译器优化到一个循环?在下面更有趣的情况下是这样吗?

func isOdd(n: Int) -> Bool {
  if n == 0 { return false; }
  else { return isEven(n - 1) }
}

func isEven(n: Int) -> Bool {
  if n == 0 { return true }
  else { return isOdd(n - 1) }
}
最好的检查方法是检查编译器生成的汇编语言代码。我把上面的代码和编译它:
swift -O3 -S tco.swift >tco.asm

输出的相关部分

.globl    __TF3tco3sumFTSiSi_Si
    .align    4,0x90
__TF3tco3sumFTSiSi_Si:
    pushq    %rbp
    movq    %rsp,%rbp
    testq    %rdi,%rdi
    je    LBB0_4
    .align    4,0x90
LBB0_1:
    movq    %rdi,%rax
    decq    %rax
    jo    LBB0_5
    addq    %rdi,%rsi
    jo    LBB0_5
    testq    %rax,%rax
    movq    %rax,%rdi
    jne    LBB0_1
LBB0_4:
    movq    %rsi,%rax
    popq    %rbp
    retq
LBB0_5:
    ud2

    .globl    __TF3tco5isOddFSiSb
    .align    4,0x90
__TF3tco5isOddFSiSb:
    pushq    %rbp
    movq    %rsp,%rdi
    je    LBB1_1
    decq    %rdi
    jo    LBB1_9
    movb    $1,%al
LBB1_5:
    testq    %rdi,%rdi
    je    LBB1_2
    decq    %rdi
    jo    LBB1_9
    testq    %rdi,%rdi
    je    LBB1_1
    decq    %rdi
    jno    LBB1_5
LBB1_9:
    ud2
LBB1_1:
    xorl    %eax,%eax
LBB1_2:
    popq    %rbp
    retq

    .globl    __TF3tco6isEvenFSiSb
    .align    4,0x90
__TF3tco6isEvenFSiSb:
    pushq    %rbp
    movq    %rsp,%rbp
    movb    $1,%al
LBB2_1:
    testq    %rdi,%rdi
    je    LBB2_5
    decq    %rdi
    jo    LBB2_7
    testq    %rdi,%rdi
    je    LBB2_4
    decq    %rdi
    jno    LBB2_1
LBB2_7:
    ud2
LBB2_4:
    xorl    %eax,%eax
LBB2_5:
    popq    %rbp
    retq

这清楚地表明,swift在这两种情况下都做尾调用优化。

此外,isOdd / isEven函数的有趣之处在于,编译器不仅似乎执行TCO,而且还在每种情况下内联其他函数。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读