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