令人困惑的 clang 斐波那契拆解

问题描述 投票:0回答:1

我无法理解这是怎么回事:

int fib_iter(int num) {
    int a = 1;
    int b = 1;
    int c = 0;

    for (int i = 0; i < num; i++) {
        c = a;
        b += a;
        a = c;
    }
    
    return b;
}

神箭

显示为

fib_iter: # @fib_iter
  lea ecx, [rdi + 1]; ecx = rdi + 1
  test edi, edi; set registers from edi & edi
  mov eax, 1; eax = 1
  cmovg eax, ecx; if (ZF AND SF=OF) eax = ecx
  ret

没有任何调用或跳转,这是怎么回事?

assembly clang x86-64 llvm
1个回答
0
投票

正如评论者指出的那样,这是一个简单的拼写错误。

int fib_iter(int num) {
    int a = 1;
    int b = 1;
    int c = 0;

    for (int i = 0; i < num; i++) {
        c = a; // PROBLEM
        b += a;
        a = c;
    }
    
    return b;
}

应该是

int fib_iter(int num) {
    int a = 1;
    int b = 1;
    int c = 0;

    for (int i = 0; i < num; i++) {
        c = b; // SOLUTION
        b += a;
        a = c;
    }
    
    return b;
}
© www.soinside.com 2019 - 2024. All rights reserved.