所以,我正在做很多涉及计算2的幂的计算,所以我决定编写最快的函数来计算它们。我最初写了以下内容:
inline
auto pow2(const int exp){
auto base = 1;
return base<<=exp;
}
由于一次通过精确的位移,这是非常快速的,但后来我决定测试以下内容:
inline
auto pow2(const int exp, unsigned int base=1){
return base<<=exp;
}
该函数被调用为:
result = pow2(exponent);
这使我的代码快30%(clang ++和g ++ with -O3),但我不确定原因。我怀疑这是因为编译器以某种方式避免分配base
变量而只使用临时对象,但它只是疯狂猜测;由于这种语法,我不明白究竟避免了哪些指令。有什么想法吗?
编辑:汇编程序输出如下:
第一个版本(函数体中base
var):
pow2(int):
mov ecx, edi
mov eax, 1
sal eax, cl
ret
第二个版本(声明中base
var):
pow2(int, unsigned int):
mov eax, esi
mov ecx, edi
sal eax, cl
ret
Edit2:更多信息:根据评论中的反馈,我决定在不同的机器上测试代码,并获得一些有趣的东西。在配备Intel(R)Core(TM)i7-2600 CPU @ 3.40GHz的工作计算机上,此代码的速度确实提高了30%。在我的笔记本电脑上,使用Intel(R)Core(TM)i7-4600U CPU @ 2.10GHz,两个版本的基准测试相同。