常数优化
- register
传说中的寄存器变量,“建议”编译器把变量放在寄存器中。只能用于栈变量,比如函数的传参。
效果:
for(int i=-1e9;;++i);
for(register int i=-1e9;;++i);
自己试试就知道
- IO 优化(所有系统通用的)
fread(input,1,1<<30,stdin);
把整个输入文件读入
fwrite(output,1,strlen(output),stdout);
是个快速的不换行 puts,把所有输出存在里面最后输出一次
- 取模优化(仅O2)
设模数为 mod
int inc(int x,int v){x+=v;return x>=mod?x-mod:x;}
代替取模 +
int dec(int x,int v){x-=v;return x<0?x+mod:x;}
代替取模 -
这两个函数在 O2 下会自动 inline,速度比你手动 inline 还要快,在 FNT 中非常好用
- 前置 ++
后置 ++ 需要保存临时变量以返回之前的值,在 STL 中非常慢。事实上,int 的后置 ++ 在实测中也比前置 ++ 慢 0.5 倍左右(UOJ 上自定义测试)
- 数据结构用指针代替数组
数组在用方括号时做了一次加法才能取地址!
所以在那些计算量超大的数据结构中,你每次都多做了一次加法!!!在 64 位系统下是 long long 相加,效率可想而知。
因此用指针!
这里有个 trick:
由于 C++ 中 a[b] = *(a+b) = *(b+a) = b[a],
因此你可以用 i[a] 代替 a[i],用 1[b] 代替 b[1],多维数组同样可以,你甚至可以用 5[4[3[2[1[a]]]]] 代替 a[1][2][3][4][5]。
用处,混乱代码 233。