如果我这样做了:
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/