关于卡常
  • 板块学术版
  • 楼主C6H6
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/10/23 16:38
  • 上次更新2023/11/2 11:43:01
查看原帖
关于卡常
569516
C6H6楼主2023/10/23 16:38

我之前看到一个很逆天的快速幂写法

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的分支预测命中率不高时换成短路运算符是否能加快程序速度?

2023/10/23 16:38
加载中...