一些常数优化

转自:http://blog.csdn.net/qq_33583069/article/details/53086992

如果编译器没有开O2优化
用库函数常数会凭空增加很多。。
似乎NOIP考场不开O2
某些时候,如果你优化到无法再优化的时候
尝试去自己重新实现库函数。

比如

  • isdigit()
  • max()/min()
  • unique()/lower_bound()/upper_bound()
  • scanf()/printf()
  • cin/cout
  • getchar()/putchar()
  • STL::queue/stack/priority_queue/deque

常数优化:

位运算

没有O2的时候(有O2不用管。编译器会帮你)
x*10 <=> (x<<3)+(x<<1)
x!=y <=> x^y
x!=-1 <=> ~x
x*2 <=> x<<1
x*2+1 <=> x<<1|1
x/2 <=> x>>1
(x+1)%2 <=> x^1
x%2 <=> x&1
x%2==0 <=> ~(x&1)

语法

inline 在非递归函数前加修饰。
循环变量 int i =>register int i

c++没有尾递归优化。所以可以自己手写栈来优化递归。

原则上尽量减少乘/除/取模 指令
取模指令如果是逐渐累加的话,

x+=add;x%=mod;
=> x+=add;x>=mod?x%=mod:1;

A?B:C 好像要比if,else语句快。

memset初始化细节 memset(a,0x3f,sizeof(a));
最后的a[1] = 0x3f3f3f3f
int的极限是 0x7fffffff
还可以~0u
INF有的时候不要刚好赋值到0X7FFFFFFF,如果有2个inf的值相加就会溢出。

乘法溢出。
这个要注意。不要直接全部long long这样慢很多

关于类型转换,一般不用管,编译器会处理。
但是,考试环境有点老?没试过,所以如果有不同类型的话最好在前面显示的强转一下。

赋值>int的话请在数字后加LL


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值