为了编写高效的程序,需要在设计层次上做考虑,并在实现层次上考虑细节。(一定要在程序的生命周期已开始就考虑性能)。

“编写高效的C++程序”指要编写能高效运行的程序,而不是高效地编写程序,要学会如何节省用户的时间,而不是节省你自己的时间。

1、实现高效的两种方法

如果想编写真正高性能的应用,就必须从设计一开始就考虑效率问题。设计级效率包括:选择高效算法,避免不必要的步骤和计算,而且要选择适当的设计优化。

2、C++是一种低效语言吗

C++包括一些高级构造,如异常和虚方法,这些构造都相当的慢。

C++语言有一个一般性的设计原则:如果不用它,就不必为之付出。(如果不使用虚方法,就不用付出使用虚方法的性能代价。)

好的优化编译器可以自动完成某些语言级优化,请检查编译器文档,了解有关细节。

1、高效的处理对象

①、传引用

对象应该很少按值传递给函数或方法。

总体来说,如果一个函数要修改一个对象,可以简单的按引用传递对象;如果函数不会修改对象,则应按const引用来传递。

②、按引用返回

应当按引用从函数返回对象,以避免不必要的复制。(不能返回一个局部对象的引用和指针)。

③、按引用捕获异常

应当按引用捕获异常,避免额外的复制。[异常在性能方面是重量级的,因此在异常方面做小幅改进也会大大改善效率。]

④、避免创建临时对象

很多情况下,编译器会创建临时的匿名对象。

⑤、返回值优化

按值返回对象的函数可能导致创建一个临时对象。[一般编译器会把大多数情况下的临时变量予以优化,这种优化称为返回值优化]

2、不要过度使用高开销的语言特性

从执行速度方面看,许多C++特性的开销都很大,异常、虚函数、RTTI(运行时类型识别)更是首当其冲。即使在程序中没有显式地使用异常和RTTI特性,这个特性也会带来性能开销,仅仅是因为可能会用到这些特性,为了对此提供支持,都会在执行中增加额外的步骤。

[编译器可以指定允许指定编译程序的方式,即:编译程序时根本不支持这些特性。]

如:Linux g++ 3.2.2

如果g++指定标志来禁用异常:g++ -fon-exceptions test.cpp

如果g++制定标志禁用RTTI:g++ -fon-rtti test.cpp [编译器会成功编译,但是无法运行]。

3、使用内联方法和函数

程序员的内联请求只是对编译器提出一个建议,即使你想内联某个函数,编译器也可以拒绝内联该函数。

另一方面,一些编译器会在完成优化的步骤中,对适当的函数和方法进行内联,即使这些函数没有标记inline关键字。[编译器文档查询]

如果大家对C/C++感兴趣的话,可以加一下我们的学习交流Q群:637  935  295,免费领取一套学习资料和视频课程哟~

三,设计效率

程序中的设计选择对性能的影响远远超过了语言级选择的影响。[选择合适的算法]

优化程序的三个设计技术:缓存、对象池、线程池。

1、尽可能缓存

缓存(Caching)是指存储有关内容以便将来使用,从而避免获取或再次计算。

下面任务会很慢:

· 磁盘存取:如果会经常存取一个文件,应该把文件内容保存在RAM中。

· 网络通信

· 数学计算

· 对象分配[对象池]

· 线程创建[线程池]

2、使用对象池

对象池技术可以避免在程序的生命周期中创建和删除大量对象,如果知道程序需要同一类型的大量对象,而且对象的生命周期都很短,就可以为这些对象创建一个池(pool)进行缓存。只要代码中需要一个对象,就可以向对象池申请,用完此对象后,要把它放回池中。对象池只创建一次对象,因此他们的构造函数只调用一次,而不是每次使用时都调用。

3、线程池

线程支持是特定于平台的。

C++高级编程篇-如何编写高效的C++篇相关推荐

  1. unix环境高级编程(上)-文件篇

    目录 前言 unix基础知识 unix标准化和实现 unix提供的文件IO 文件和目录 标准IO 系统数据文件 前言 笔者将<unix环境高级编程>主要内容总结为三篇:文件篇,进程篇,高级 ...

  2. java主类与源代码名称_Java高级编程基础:类文件结构解析,看穿Class代码背后的秘密...

    类文件结构 在说完了JVM内部结构后,接下来我们需要说一下另外一个非常重要的基础概念Class类结构. 我们既然知道了开发的Java源代码会首先被编译成字节码文件保存,JVM的类加载器会读取这些文件内 ...

  3. 体会Linux与生俱来的美 高级篇 编写自己的Shell解释器(全文)

    http://www.csdn.net/subject/linux/shell.mht 编写自己的Shell解释器 摘要:本期的目的是向大家介绍shell的概念和基本原理,并且在此基础上动手做一个简单 ...

  4. bytebuffer怎么转成string_002.ABB机器人高级编程--String飞升篇

    ABB机器人高级编程--String飞升篇 最近国庆节所以托更了,不好意思. 今天也分享的也不能算是飞升,只是把我几年前写的代码和大家分享一下,希望大家相互学习一起进步,希望更多有这方便意向和天赋的朋 ...

  5. 《PHP精粹:编写高效PHP代码》——第1章面向对象编程

    本节书摘来自华章社区<PHP精粹:编写高效PHP代码>一书中的第1章面向对象编程,作者:(美) Davey Shafik,更多章节内容可以访问云栖社区"华章社区"公众号 ...

  6. 《PHP精粹:编写高效PHP代码》——1.1节为什么要使用面向对象编程

    本节书摘来自华章社区<PHP精粹:编写高效PHP代码>一书中的第1章,第1.1节为什么要使用面向对象编程,作者:(美) Davey Shafik,更多章节内容可以访问云栖社区"华 ...

  7. abb机器人编程手册_002.ABB机器人高级编程--String飞升篇

    ABB机器人高级编程--String飞升篇 最近国庆节所以托更了,不好意思. 今天也分享的也不能算是飞升,只是把我几年前写的代码和大家分享一下,希望大家相互学习一起进步,希望更多有这方便意向和天赋的朋 ...

  8. unix环境高级编程基础知识之第二篇(3)

    看了unix环境高级编程第三章,把代码也都自己敲了一遍,另主要讲解了一些IO函数,read/write/fseek/fcntl:这里主要是c函数,比较容易,看多了就熟悉了.对fcntl函数讲解比较到位 ...

  9. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

最新文章

  1. 小视频开发过程中最关注的两点关键
  2. 使用回溯算法分析八皇后问题
  3. python 列表推导_说说在 Python 中如何使用列表推导
  4. ue4 运行禁用鼠标_[UE4] VS code使用LuaPanda断点调试
  5. matlab程序转java_用面向对象的方法将一段JAVA代码转化为matlab
  6. OpenShift 4 - 利用 File Integrity Operator 实现对集群节点进行入侵检测
  7. halcon学习之颜色与纹理
  8. 【洛谷P5019+P1969+P3078】道路铺设(暴力模拟/差分)
  9. 百度网盘怎么设置提取码 百度网盘自定义提取码方法
  10. java基础面试题(二)附答案
  11. 7-3 寻找大富翁 (50分)
  12. 【wsl2】从头开始配置
  13. unet预测图片全黑/全灰解决方案(keras)
  14. Python3相对路径符号斜杠 (/),点斜杠(./),点点斜杠(../)的意思
  15. Webstorm2018激活和汉化详细步骤
  16. MDK V5.28来了,STM32G4也来了
  17. Retrofit的好处
  18. 安卓应用移植鸿蒙(二):移植安卓的字符串等资源文件到鸿蒙应用
  19. 网狐框架分析一 -- 150616
  20. 三边形面积(海伦公式及拓展)

热门文章

  1. 互联网晚报 | 9月28日 星期二 | 乐视手机宣布回归;小鹏汽车累计交付量突破10万台;苹果售出20亿部iPhone...
  2. 京东到家休闲食品即时消费趋势报告
  3. ​​2021快手母婴行业数据价值报告
  4. 2020年快手母婴生态报告
  5. php 获取一年的月份_php 根据日期获取星座
  6. 《大数据》致谢审稿专家
  7. 【2016年第1期】CCF大专委2016年大数据发展趋势预测—— 解读和行动建议
  8. NSA(美国国安局)泄漏Exploit分析
  9. Android开发学习—— Broadcast广播接收者
  10. [\u4e00-\u9fa5] //匹配中文字符