当前位置: 首页 > news >正文

C++常用代码优化策略

C++代码常用的优化策略

1.不存在指向空值的引用,意味着引用比指针的效率更高,因为在使用引用之前不需要测试它的合法性;指针可以被重新赋值以指向另一个不同的对象,但是引用总是指向它初始化时指定的对象。

2.使用位运算代替加减乘除取余等计算。

3.用switch代替多层if else,看汇编代码可知,switch有点空间换时间的意思。如果switch不可行,则将最常见的场景放在if分支链的最前面。

4.减少函数调用,函数调用需要两次跳转,外加栈内存操作。

5.使用内联函数处理代码量小的函数来消除函数调用开销,空间换时间,实际工作中,如果代码量不是很大,我一般都会使用强制内联的方式  __attribute__((always_inline))。

6.防止浅拷贝,例如有一个Simple的类,最好把Simple(),Simple(const Simple&), Simple& operator=(const Simple&)声明为私有,或者继承boost的noncopyable库,class Simple : public boost::noncopyable{}。

7.减少临时对象的使用。

8.a+=b的形式效率会高于a=a+b,所以使用时首先考虑使用+= 、 -= *= 和 /=,而不是使用+ 、 、 、 /。

9.在cache级别进行优化(例如使一个结构正好充满一个cache行,增加命中率等,此处内容较多,以后有机会再具体分析)。

10.如果可能,对象尽量放在栈上,不要放在堆上,即初始化的时候使用A  a(变量1,变量2,...),而不是A  a = new(变量1,变量2,...)。

11.尽量使用初始化列表进行初始化工作,例如:A::A() : a(0), b(0), c(0) {},而不是初始化函数A::A() { a= b = c = 0; } 。

12.如果函数并不需要返回值,不要定义。

13.尽量减少你程序的计算量,例如在草稿纸上简化你的计算式。

14.不需要的数据,不要去初始化,初始化大块内存,使用memset。

15.考虑使用profiler和vtune等性能分析工具识别程序中的耗时部分,已准确定位到可以优化的部分。

16.在for语句循环递增变量的时候,使用++i,而不是后置的i++,因为前者不需要返回一个临时对象.

17.减少内存的拷贝操作,减少循环和递归的使用,能用指针替换的绝对不拷贝传递整块内存。

18.vector的clear方法并不能把内存回收,要使用swap来回收内存。

19.使用stl容器的时候,建立指针的容器而不是对象的容器,因为拷贝指针很快。

20.函数中传参数的时候,如果是大对象(vector等)尽量传引用。

转载于:https://www.cnblogs.com/simplepaul/p/7691839.html

相关文章:

  • 数据库的备份与恢复
  • mybatis的mapper的代理学习
  • R语言学习笔记(二)导入数据
  • Android RecyclerView下拉刷新、上拉加载更多、到底自动加载更多
  • linux三剑客之awk从入门到精通
  • 【简记】HTML + CSS 的一些要点(不定时更新)
  • 面向接口编程实现不改代码实现Redis单机/集群之间的切换
  • caffe实现自己的层
  • Python 字典 values() 方法
  • 【学习笔记】计算机网络-网络常用命令(一)
  • 洛谷2073 送花 线段树
  • Class的继承
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • iOS之CAGradientLayer属性简介和使用
  • 近百年前宝洁发明“肥皂剧”,阿里要创造“种草剧”!
  • centos安装java运行环境jdk+tomcat
  • css的样式优先级
  • CSS实用技巧干货
  • FineReport中如何实现自动滚屏效果
  • github从入门到放弃(1)
  • Java精华积累:初学者都应该搞懂的问题
  • JSDuck 与 AngularJS 融合技巧
  • Map集合、散列表、红黑树介绍
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Spring核心 Bean的高级装配
  • Spring声明式事务管理之一:五大属性分析
  • Swift 中的尾递归和蹦床
  • VuePress 静态网站生成
  • 那些被忽略的 JavaScript 数组方法细节
  • 如何解决微信端直接跳WAP端
  • 阿里云服务器购买完整流程
  • ​低代码平台的核心价值与优势
  • #Spring-boot高级
  • $.ajax()方法详解
  • (vue)页面文件上传获取:action地址
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .net 托管代码与非托管代码
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .net中调用windows performance记录性能信息
  • ?php echo ?,?php echo Hello world!;?
  • [ C++ ] STL---string类的模拟实现
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [BZOJ 1040] 骑士
  • [bzoj 3534][Sdoi2014] 重建
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [GXYCTF2019]BabySQli1
  • [GXYCTF2019]禁止套娃
  • [idea]关于idea开发乱码的配置
  • [jquery]this触发自身click事件,当前控件向上滑出
  • [JS入门到进阶] 前端开发不能写undefined?这是误区!
  • [LWC] Components Communication