C++ 一些卡常技巧

i++与++i
在剑指offer的代码中,for循环中全都用的是++i而不是i++,因为++i的效率比i++更高,但是往往编译器会优化。

开O2之后FFT会比不开快几倍
  不开O2:NTT 比 FFT 快
  开O2:FFT 比 NTT 快

常数尽量声明成常量
  模数尽量声明成常量

优化高位数组的寻址
  用指针保存上一次使用的地址,直接加偏移。

能用位运算尽量用位运算
  当然,编译器大多数情况下会帮你优化掉。 
   
少用除法和取模
  加法运算只要1个时钟周期,乘法运算只要3个时钟周期,而除法和取模运算要几到几十个时钟周期。
  
对于一个值的重复运算,存入临时变量中
  
编写缓存友好的代码

空间局部性好
  尽量使用步长为1的访问模式,即访问的内存是连续的。
  在遍历高维数组是很重要

时间局部性好
  是内存访问的工作集尽量小
  在统计整数二进制表示中11的个数时,分两段查表有时不如分三段好。
  
避免使用步长为较大的2的幂的访问模式
  避免缓存冲突。
  在状压DP、使用高位数组时很重要
  解决方法:把数组稍微开大一些

参考来源

一些卡常技巧
https://blog.csdn.net/ez_yww/article/details/78472427
If-else 三目运算符 底层实现 效率差异
https://blog.csdn.net/Dr_Unknown/article/details/51363196
循环中++i和i++的差别
https://blog.csdn.net/cFarmerReally/article/details/54583895

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值