基本卡常
作者:互联网
本文将会持续更新
卡时间
预处理指令和编译
O2
O2 是最常见的一种优化,基本来说有两种使用方式,第一种是在编译时加上-o2
选项,例如编译a.cpp
时,使用 O2 。
g++ a.cpp -o a.exe -o2
即可。
第二种方法是在预处理指令中添加 O2 ,即在代码首行添加如下指令:
#pragma GCC optimize(2)
火车头
火车头也是 C++ 中一种比较常见的优化方式,基本应用于离线评测。
火车头比较长,就不一个一个解释了,直接放代码。
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
位运算
关于位运算,如果想了解得更详细,可以看一下https://www.luogu.com.cn/blog/2021wuyueyang/qian-tan-wei-yun-suan1和https://www.luogu.com.cn/blog/2021wuyueyang/qian-tan-wei-yun-suan2
定义
位运算就是直接对整数在内存中的二进制位进行操作。
对乘法、除法的加速
首先了解a>>x
等价于 \(\frac{a}{2^{x}}\) 和a<<x
等价于 \(a \times 2^{x}\) 。
于是我们可以在一些除法、乘法计算量比较大的题目中使用位运算加速。
例如以下题目:
给你 $ n (n \leq 10^{5}) $ 个数,进行 $ m (m \leq 10^{3}) $ 次操作,每次操作会让每个数乘上 \(2^{x}\) , \(x\) 输入 ,保证不会溢出。
相信大多数 OIer 都能写出以下代码:
for(int i=1;i<=m;++i) {
scanf("%d",&x);
int p=pow(2,x);//pow是快速幂
for(int j=1;j<=n;++j) {
a[j]*=x;
printf("%d ",a[j]);
}
printf("\n");
}
但是这种算法效率不佳,于是我们可以做一些优化,如下:
for(int i=1;i<=m;++i) {
scanf("%d",&x);
for(int j=1;j<=n;++j) {
a[j]<<=x;
printf("%d ",a[j]);
}
printf("\n");
}
其效率远远高于前一种算法,同时可以使代码简洁一些。
卡空间
标签:基本,GCC,falign,functions,O2,pragma,卡常,optimize 来源: https://www.cnblogs.com/shuger/p/16561422.html