分享好友 最新动态首页 最新动态分类 切换频道
c++ 性能优化策略
2024-12-26 19:19

作者:D_Guco 
来源:CSDN 
原文:https://blog.csdn.net/D_Guco/article/details/75729259 

c++ 性能优化策略

 

1 关于继承:不可否认良好的抽象设计可以让程序更清晰,代码更看起来更好,但是她也是有损失的,在继承体系中子类的创建会调用父类的构造函数,销毁时会调用父类的析构函数,这种消耗会随着继承的深度直线上升,所以不要过度的抽象和继承,更为严重的是当多重继承中并且有虚函数的存在时情况更为复杂,的确,这些问题涉及开销,但是,多重继承减少了编码的负担,同时也让问题的解决方案更加简洁,这当然要付出一些代价.总之,与n个基类的多重继承层次相关的额外虚函数表有n-1个。派生类和最左边的非虚基类共享同一个虚函数表。因此,带有2个基类的多重继承层次,有1个(2-1=1)基类的虚函数表和1个派生类的虚函数表(最左边的基类与派生类共享该虚函数表),总共有2个虚函数表,如果有虚继承的存在,会进一步增长这个过程,它是有额外的开销的。

2 对象的复合:对象的复合和继承很相似,当一个对象包含其他对象构造时也会引起额外的构造。关于这点可能会有很多人不解,认为这是不可避免的,举个例子,比如你的类A中包含了类B非指针和引用对象,那么在你构造对象a的时候会自动调用b的无参构造函数,即使你还没有用到她,用指针代替就没有这种消耗,另外如果你的一个对象中用到数组和字符串,你是选择string和vector还是char* 和c系的数组呢,如果没有用到c++stl库提供的相关的高级用法,建议选择后者。

3 构造函数:尽量用参数列表初始化代替参数,避免值传递初始化。

4 变量延时定义:从c系转过来的仍保留着c的习惯,在函数第一行先把所有用到的变量都定义好,但是c是没有运行时的消耗的,对于c++时不一样的,对于c++对象的构造和销毁时有消耗的,如果有大量的对象只在某个if条件的一个分支中出现,那就会有50%的情况这些消耗是可以避免的。对于这点在一个类中也是一样的,如果成员中有成员只在某个时刻能用,就用指针代替,在构造对象时初始化成空指针,避免构造时调用他的构造函数。

5 虚函数:虚函数的底层实现是通过一个虚函数表来实现的,因此有虚函数的类构造时必须先初始化虚函数表,函数调用时也必须先找到虚函数表,然后通过指针偏移找到相应的函数,通常情况下调用虚函数是没有运行时消耗的,但是根据编译器的实现不同,在调用虚函数时,有些调用可能导致增加虚函数表大小的额外开销,或者只有那些需要调整this指针的调用才会发生额外的运行开销,但不会增加虚函数表的大小,在多重继承和虚基类的时候这种消耗会显著增加,关于继承已经提过,所以避免滥用虚函数和虚继承,有时候可以用模版设计来代替虚继承,把运行时的消耗提前到编译期。关于虚函数的消耗:点击打开链接

6 返回值优化: 虽然c++编译器会选择性的进行RVO优化但是不是强制的,当函数有多个返回语句并且返回不通名称的对象,函数过于复杂,返回对象没有定义拷贝构造函数时,rvo优化是不会执行的,所以当函数返回一个很大的对象时在不确定rvo优化会执行时,尽量避免值传递。

7 变量的定义:在定义变量时尽量避免类型的不匹配造成临时变量的产生。

8 内存管理:c++内存管理的大权由我们自己掌握,对于项目中要频繁申请和释放的对象建议用简单的内存池来管理,可以大大的降低频繁申请和释放内存带来的消耗。

9 善用内联:内联函数不仅仅是简单的函数调用似的优化,他还有一个最大的优点就是,可以让编译期进行进行边界代码的运行环境优化,内联把代码拷贝到执行环境处避免了函数调用带来的消耗,并且编译期可以进行正常的编译优化,而函数调用是不能实现的。

10 stl :记住一点stl不是唯一的选择,有时候也不是最好的选择,合理选择stl善用stl算法。

11 缓存:对于多次使用的计算结果及时缓存,避免重复计算。

12 延时计算:对于不关心计算结果的计算过程尽量延时执行或者异步去执行。

13 多线程:尽可能的使用无锁式多线程开发,锁是一个非常消耗性能的东西,保证数据同步的手段有很多,voalite,原子操作都可已实现,尽量通过一些技巧使用这些手段避免所得使用,如果迫不得已要使用锁,尽量减少锁的消耗,比如降低锁的粒度,使用性能更高的锁等等。

14 std::move操作: 当不得不进行深拷贝时,如果深拷贝数据源在拷贝后就不在使用,尽可能的用move操作代替,或者在参数传递时用move操作代替临时的实参变量。

15 cpu缓存:合理的利用cpu cache可以极大的提高代码的运行效率(例如:数组中以每列遍历和每行遍历的效率的不同),当然多线程环境下也要考虑cpu cache带来的影响。

16 内存对齐:在进行网络编程时,最好对网络中传送的数据快进行内存补齐,通常是8字节对其,提高cpu访问内存效率,从而提高数据读写速度。

17 函数参数:用const引用代替值传递,如果函数参数过多,可以用对象来打包参数,减少参数过多带来的性能消耗。

18 算法: 尽可能的优化你的算法。

19 关于智能指针:对于智能指针我的选择是必须用,它可以大大降低程序的crash频率,但是智能指针的和普通指针相比是有额外的消耗的,她的底层是一个原子操作来来统计引用数和一个普通指针,虽然原子操作和锁相比性能高了不少但是和普通的加减操作还是慢了不少,智能指针的大小为16个字节,而普通指针的大小只有4个字节,拷贝的成本也不一样,所以在使用正确的情况下可以使用智能指针的引用来减少拷贝的消耗(注意这里的前提是正确的使用引用,不要引用以一个即将被销毁的变量)。

20 内存池:对于需要频繁申请和释放的内存对象,如果可以重复利用对象的内存,强烈建议通过内存池或者重载对象的new操作符或者重载对象的placement new操作符来减少频繁的申请和释放内存,从而减少申请和释放内存的消耗和内存碎片的产生。

21 其他优化方案:位运算代替乘除法,前缀运算符代替后缀运算等等。

=============== End

最新文章
前瞻全球产业早报:阿里云将在海外五国新建数据中心
全国规模最大电力5G专网在秦山核电建成上线据官微消息,12月10日,秦山核电在5G专网正式上线发布会上宣布:中国核电旗下秦山核电成为国内首个实现厂区5G专网全覆盖的核电基地。据了解,这也是全国规模最大的电力5G专网,这座即将迎来开工建
推荐系统架构
推荐和搜索系统核心的的任务是从海量物品中找到用户感兴趣的内容。在这个背景下,推荐系统包含的模块非常多,每个模块将会有很多专业研究的工程和研究工程师,作为刚入门的应届生或者实习生很难对每个模块都有很深的理解
长安欧尚终于翻身了,长安汽车又一硬货
外观方面,采用家族式的前脸设计,大尺寸的六边形进气格栅搭配上云鹰logo,具有很高辨识度。两侧的前大灯组采用不规则的造型设计,配有全led光源,大灯组下方为led日间行车灯,下方的雾灯区域采用竖向排列,整体的线条比较丰富,前脸的造型
微信圆形二维码生成器,让您轻松生成拥有个性化的二维码!
如果您是一位微商、营销达人或者平面设计师,在使用微信营销方面是不是有时需要定制一些个性化的二维码呢?在线自动生成二维码的方式已经非常普遍,但是如何可以生成一个美观、拥有个性色彩、灵活方便修改的圆形二维码呢?本文介绍一个便捷
小米第三家"AI智能工厂"在武汉开建!
在智能制造领域,小米集团再次迈出了坚实的一步。近日,小米宣布在武汉东湖高新区开工建设其第三座智能工厂——小米智能家电工厂。这座工厂的建设标志着小米在汽车工厂、手机工厂投产后的又一重要里程碑。小米智能家电工厂的建设不仅是小米
湖南百度蜘蛛池出租信息,打造高效网络爬虫解决方案,湖南百度蜘蛛池出租信息最新
湖南百度蜘蛛池出租信息,为您提供高效的网络爬虫解决方案。我们拥有稳定的蜘蛛池资源,可帮助您快速提升网站权重和排名。我们提供优质的售后服务和技术支持,确保您的使用效果。欢迎联系我们了解更多详情,开启您的网络爬虫之旅。最新湖南
Win11 有救了|这款专属优化工具,让系统原地起飞!
距离 Windows 11 正式版发布也有一年了,但时至今日争议性还比较大。之所以说是争议而不是单纯的烂,Win11 还是有许多有用的功能更新。很大一部分用户对Windows 11都是持观望态度,升级的欲望并不高,这其中一个很大的原因是用户对Win11并
美编助手
美编助手电脑版是款适用于运营用户们使用的多账号管理助手。美编助手正式版能够有效帮助用户运营工作号,生成好的内容和管理矩阵。美编助手专为提升新媒体运营与变现效率。还拥有编辑器增强,多账号一键切换,丰富精美的样式, 热点追踪、
把握关键词推广技巧 有效提升网站推广质量
seo的任务是提升关键词的排名,然而对商家来说,几个关键词排名的提升带来流量在有限的转化率下并不能为销售业绩带来质的飞跃。我们做网络推广,一方面要想办法提高网站的流量,例如加大力度做网站的seo,另
漫蛙漫画无广告弹窗打扰下载-漫蛙漫画无广告弹窗打扰纯净清爽无广告漫画软件下载链接页面入口
漫蛙漫画无广告弹窗打扰内置的漫画评分系统,让用户能够为自己的阅读体验打分,同时也为其他漫迷提供了宝贵的参考意见。而且会定期举办漫画创作大赛,为优秀的创作者提供展示机会和丰厚奖励,激发创作热情。喜欢的小伙伴欢迎点击下载,让自
相关文章
推荐文章
发表评论
0评