《提高c++性能的编程技术》读书笔记
一个程序的执行效率是取决于改程序翻译成汇编语言之后的执行的机器指令的条数。而每一个机器指令的执行的周期是一定的。C语言和C++都是高于汇编语言的高级语言,其中,C语言源代码与其相应的机器指不是完全同一的,但是大致是线性的,但是C++语言的源代码与编译代码的开销变化很大的。一条C++指令可能对应于3条汇编指令,而另外的一条可能对应300条。正因为这样,很多时候我们写出来的代码本身就是低效的,这不能全然怪罪于C++语言本身,那么真正的软件的低效又体现在什么地方呢?这本书给了我们答案:软件的效率是由设计的效率以及编码的效率来决定的,其中,设计的效率关乎程序的高层设计,也就是说你要有把握全局的能力,在很大的程度上,这与语言本身并没有关系,无论再怎么高效的语言都弥补不了糟糕的全局设计。同时,书中也在每一点上给了我们实际的建议:
1、c++临时对象
创建对象是一个费时,费空间的操作,会产生临时对象的几种情况:
1)以值的方式给函数传参
按值传递时,首先将需要传给函数的参数,调用拷贝构造函数创建一个副本,所有在函数里的操作都是针对这个副本的,也正是因为这个原因,在函数体里对该副本进行任何操作,都不会影响原参数。
指导原则:在传递函数参数时,选择以常量引用的方式,而不是传值方式。
2)类型转换
我们在做类型转换时,转换后的对象通常是一个临时对象。
构造函数应该避免隐式类型转换,会隐含产生临时变量。用explicit constructor代替隐式转换。
3)函数需要返回一个对象时
当函数需要返回一个对象,他会在栈中创建一个临时对象,存储函数的返回值。
4)对于大部分容器(包括链表)而言,调用容器的end()函数将返回一个临时对象,并且这个对象需要被构造和析构。由于这个临时对象的值在循环中是不会改变的,因此如果在每次循环迭代中都重新计算,将会导致不必要的开销,实际上这个临时对象只需计算一次,将其保存到局部对象当中即可。
5)使用后置++时会产生临时对象,应多使用前置++。
2、重载、覆盖和隐藏
1)对函数f()进行重载(overload)是指,在相同作用域中定义另一个相同名字的函数,并且与f()有着不同的参数类型、顺序或数目。
2)对虚函数f()进行覆盖(override)是指,在派生类中定义一个相同名字的函数,并且这个函数的参数列表与f()相同。
3)对外层作用域(基类、外部类或名字空间)中的函数f()进行隐藏(hide)是指,在内层作用域中(派生类、嵌套类或嵌套名字空间)定义另一个相同名字的函数,这将隐藏定义在外层作用域中的同名函数。
3、虚函数(模板对继承的优势)
利用好虚函数的优点:动态绑定,以及节省代码。尽量避免虚函数带来的开销。
1)虚函数的开销可分为三种:
- 必须在构造函数内初始化vptr:这个相当于是在不使用虚函数的类中内置一个type变量的开销,是值得的,不讨论。
- 需要使用指针间接跳转:相当于在switch中通过type来调用相应版本函数的开销,不讨论。
- 虚函数不能内联:这个是关注点。
2)方案1:不继承
不继承的话就是将各子类独立出来,缺点是在代码中会充斥大量的switch,非常没有灵活性,排除。
3) 方案2:继承
继承的缺点如3.2.1所述,成员函数无法内联,尤其是非常短小使用频繁的函数,会增加大量开销。
4) 方案3:模板
使用模板来实现隐式接口:
4、内存池
内存池(Memory Pool)是一种内存分配方式。 通常我们习惯直接使用new、malloc等API申请分配内存,这样做的缺点在于:由于所申请内存块的大小不定,当频繁使用时会造成大量的内存碎片并进而降低性能。
内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。
5、内联
内联是用方法的代码来替换对方法的调用。内联通过消除调用开销来提升性能,并且允许进行调用间优化。内联的主要作用是对运行时间进行优化,当然他也可以使可执行映像变得更小。总结如下:
内联提升性能的两个方面:
1)调用间优化
调用间优化是面向某一方法的调用过程,基于对上下文场景更加全面的理解,使得编译器在源代码层面及机器代码层面对方法进行优化。这种优化的一般形式为:在编译期间进行一部分预处理,避免在运行时重复类似过程。
2)避免开销大的方法调用
内联缺点:1)代码膨胀。2)有些方法本身应避免内联,如递归。如果将递归函数A内联,编译器将不断循环尝试将A方法插入到A方法中,形成死循环。
《提高c++性能的编程技术》读书笔记的更多相关文章
- csapp读书笔记-并发编程
这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...
- CSAPP 读书笔记 - 2.31练习题
根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1) 属于第一种情况 sum = x ...
- CSAPP读书笔记--第八章 异常控制流
第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 读书笔记--SQL必知必会18--视图
读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...
- 《C#本质论》读书笔记(18)多线程处理
.NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- Web高级征程:《大型网站技术架构》读书笔记系列
一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...
随机推荐
- 【题解】Crossing River
题目描述 几个人过河,每次过两人一人回,速度由慢者决定,问过河所需最短时间. 输入格式 输入t组数据,每组数据第1行输入n,第2行输入n个数,表示每个人过河的时间. 输出格式 输出t行数据,每行1个数 ...
- MUI对话框使用
一.alert告警框 用法 .alert(message,title,btnvalue,callback[,type]); document.getElementById("noclick& ...
- HashSet源码解析笔记
HashSet是基于HashMap实现的.HashSet底层采用HashMap来保存元素,因此HashSet底层其实比较简单. HashSet是Set接口典型实现,它按照Hash算法来存储集合中的元素 ...
- CTU OPEN 2017 Punching Power /// 最大独立集
题目大意: 给定n 给定n个机器的位置 要求任意两个机器间的距离至少为1.3米 求最多能选择多少个机器 至少为1.3米 说明若是位于上下左右一步的得放就不行 将机器编号 将不能同时存在的机器连边 此时 ...
- apache下logs下的日志文件简单说明
一.日志分析 如果apache的安装时采用默认的配置,那么在/logs目录下就会生成两个文件,分别是access_log和error_log 1).access_log access_log为访问日志 ...
- git 版本控制库的用法及其介绍
版本控制 说到版本控制,脑海里总会浮现大学毕业是写毕业论文的场景,你电脑上的毕业论文一定出现过这番景象! 1 2 3 4 5 6 7 8 9 10 11 毕业论文_初稿.doc 毕业论文_修改1.do ...
- java全栈商业小程序开发
此次开发只为学习和巩固,第一次学习开发 一.开发前需要了解: 开发框架MVVM.痛点.开源工具.VUE前端框架.微信支付模块.uni-app前端框架.小程序申请.开发工具下载.编写测试小程序.小程序结 ...
- Codeforces 745E Hongcow Buys a Deck of Cards 状压DP / 模拟退火
题意:现在有n张卡片(n <= 16), 每一轮你可以执行两种操作中的一种.1:获得一张红色令牌和一张蓝色令牌.2:购买一张卡片(如果可以买的话),购买的时候蓝色卡片可以充当蓝色令牌,红色同理, ...
- 【Luogu】【关卡2-1】简单的模拟(2017年10月)
任务说明:开始普及组的训练!所谓模拟,就是直接根据题意编写,思维难度简单. 铺地毯 进制转换 多项式输出 机器翻译 排座椅 笨小猴 都是简单模拟题
- js取整 - 优雅版(装逼必备)
var a = 2.98; var z1 = ~~a; var z2 = a | 0; var z3 = a>>0; console.log(z1, z2, z3); // 2, ...