如果我这样做了:

int x = 4;
pow(2, x);

这真的比仅仅做以下事情效率低得多吗?
1 << 4

是吗?

最佳答案

对。显示这一点的一个简单方法是编译以下两个函数,这些函数执行相同的操作,然后查看反汇编。

#include <stdint.h>
#include <math.h>

uint32_t foo1(uint32_t shftAmt) {
    return pow(2, shftAmt);
}

uint32_t foo2(uint32_t shftAmt) {
    return (1 << shftAmt);
}

cc -arch armv7 -O3 -S -o - shift.c(我碰巧发现arm asm更容易阅读,但如果您想要x86,只需删除arch标志)
    _foo1:
@ BB#0:
    push    {r7, lr}
    vmov    s0, r0
    mov r7, sp
    vcvt.f64.u32    d16, s0
    vmov    r0, r1, d16
    blx _exp2
    vmov    d16, r0, r1
    vcvt.u32.f64    s0, d16
    vmov    r0, s0
    pop {r7, pc}

_foo2:
@ BB#0:
    movs    r1, #1
    lsl.w   r0, r1, r0
    bx  lr

你可以看到foo2只需要2个指令vs. cc>这需要几个指令。它必须将数据移动到FPHW寄存器(foo1),将整数转换为浮点(vmov)调用vcvt.f64.u32函数,然后将答案转换为uNT(exp),并将其从FP HW移回GP寄存器。

关于objective-c - 2 ^ n指数计算的效率真的比位移的效率低吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12556906/

10-14 19:53