我之前看到一个很逆天的快速幂写法
inline long long qmi(long long a, long long b, long long ret = 1) {
for(; b; (b & 1) && ret = ret * a % mod, b >>= 1, a = a * a % mod);
return ret;
}
我是这样写的
inline long long qmi(long long a, long long b, long long ret = 1) {
for(; b; b >>= 1, a = a * a % mod) if(b & 1) ret = ret * a % mod;
return ret;
}
不同在于 if(b & 1) ret = ret * a % mod; 改为了 (b & 1) && ret = ret * a % mod,
就是将if改为短路运算符,我突发奇想,这两种写法是否会对代码效率产生影响,在 https://godbolt.org/ 试了试编译如下代码。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
if(a) cout << b << endl;
a && cout << b << endl;
return 0;
}
不开o2编译是这样的:

开o2编译是这样的:

我看不懂汇编,但是有人告诉我只要看代码行数就好了,发现不开o2时if的行数比短路运算符短(为什么短路运算符里有 add /yiw)。开了o2后if有分支,短路没有(我猜的),所以开了o2后应该是短路运算符要快吗?
如果是,那么if的分支预测命中率不高时换成短路运算符是否能加快程序速度?