常数优化

  • 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。

results matching ""

    No results matching ""