标题：C++应用程序性能优化
图书信息
书名：C++应用程序性能优化(第2版)  作者：冯宏华  徐莹  程远  汪磊  左力  编著
出版社：电子工业出版社 
ISBN：978-7-121-10633-0 
出版日期：2010年6月 
定价：49.80元 
开本：16开 
页码：360页　　
宣传语
畅销书升级版
系统介绍性能优化的工作流程，方法论，C++性能特性，分析工具等，并配合大量最佳实践及代码实例。 
总    序
去国离家十六载后，2006年，当我再次归来凝视上海这座不夜城时，不由地感慨世界真的变小了、变平了，中国作为地球村的一员，正以惊人的速度发展变化着。
世界正改变着中国，中国也不断影响着世界。在备感欣喜振奋之余，我亦常常思索，在一个越来越小、越来越平的世界里，中国会面对怎样的挑战和机遇？IBM作为全球最大的信息技术和行业解决方案公司，又在哪些方面可以与中国分享我们的先进技术、经验与创新为要的精神呢？
中国自2001年入世以后，很多企业开始迅速发展，创造出了许多新的发展模式。但是，中国、中国的企业在做大做强并开始走向世界的过程中也面临着越来越多的挑战。如何拥有更多更强的创新能力？如何提升中国在全球一体化经济格局中的竞争力？如何增强企业的可持续发展能力并逐渐走向领袖地位？这应该是很多中国企业共同面对并思考的问题。
百年来，创新求变是IBM公司虽历经艰难仍屡铸辉煌的关键。因而，IBM公司虽多次转型，却始终以超前的技术、出色的管理和独树一帜的产品领导着全球信息技术的发展，保证了世界范围内几乎所有行业用户对信息处理的全方位需求。关于创新，我们有很多的经验愿与中国业界分享。
中国开发中心（China Development Lab，简称CDL）是IBM在中国的窗口，是中国IT产业与世界交流的桥梁。CDL不仅把全球先进技术引入中国，也将中国领先的技术与行业解决方案推向世界。经过十年的蓬勃发展，CDL已经拥有5000名软件开发人员，成为IBM全球规模最大的软件开发基地之一，并成为跨国公司在中国最大的软件开发机构。十年来，一批又一批中国本土的人才，在CDL提供的平台上施展才华，并逐渐成长为技术与管理精英。
我们始终恪守着“中国人才、国际管理；中国创造、服务全球”的理念，希望将IBM的最新技术、创新和管理心得与大家共同分享，并鼓励CDL的专家走出实验室。于是，我们有幸选择了实力非凡、专业创新的电子工业出版社博文视点公司作为合作伙伴，推出这一系列丛书。该丛书的作者包括来自CDL WebSphere、Information Management、Lotus、Rational、Tivoli五大软件产品开发团队，以及来自中国开发中心新兴技术学院（Emerging Technology Institute）、行业解决方案中心（Industry Solution Labs）、软件服务团队（Software Service）等各个部门的优秀架构师、资深工程师、管理者，范围将涵盖从开发理论及平台、方法论及实践、项目管理、最新软件技术与产品、先进行业解决方案架构，到最新技术标准和前沿技术发展趋势甚至创新的商业模式探讨等诸多方面。
我希望这套丛书能把我们一线专家宝贵的经验、见解呈现给读者。在与业界分享经验和世界最新技术及趋势的同时，我们希望能为推动中国IT产业的加速发展奉献微薄之力。IBM中国开发中心将一如既往地同业界同仁一起，共铸中国信息产业的辉煌明天！
王阳 博士 
IBM全球副总裁兼中国开发中心总经理
前    言
在计算机发展的早期阶段，硬件资源相对而言是非常昂贵的。不论是CPU运行时间，还是内存容量，都给编程人员设置了很大的限制。因此，当时程序对运行性能和内存空间占用的要求是非常严格的。很多开发人员为了减少1%的CPU运行时间，为减少几十个，甚至几个字节而孜孜努力。随着计算机技术的快速发展，硬件资源变得相对便宜。因此有的观点认为在开发软件时，软件的性能优化将不再重要，硬件将解决性能问题。但事实上，这种观点是相对片面的。的确，硬件的发展解决了部分软件的性能问题。但随着硬件计算能力的提高，人们对软件功能的要求也越来越高。当今的软件功能越来越复杂，给用户的界面和操作体验也越来越智能和友好，这些需求带来的软件性能上的要求是硬件不能完全解决的。很多实际的项目证明，如果在开发软件时不重视性能的优化，最终虽然实现了功能上的要求，但软件的运行效率低下，也不能给用户带来很好的效益。因此，软件的性能优化是计算机软件开发过程中需要一直关注的重要因素。
程序性能优化的过程
从开发过程的角度来看，程序的性能优化流程一般如下图所示。
性能优化的第1步是测量，尤其是规模较大，并且比较复杂的软件系统，测量性能数据是进行性能优化的基础。有了真实的数据，才可以进行第2步，即分析数据，从而找到系统真正的瓶颈所在。毫无疑问，优化应该是针对系统的性能瓶颈进行的，而找到性能瓶颈应该是建立在真实性能数据的基础上的，而不能是主观臆断。现在有很多工具可以辅助进行性能测量和数据分析，本书也会介绍一些这方面工具的使用方法和实践经验。
进行性能优化的核心在于第3步，即分析原因，修改程序，这也将是本书重点介绍的部分。程序的性能包括很多方面，常见的有程序的启动速度、运行速度及运行时占用的内存等。而影响这些性能的因素也很多，大致可以分为如下两类。
 软件编程设计因素：如算法和数据结构的选择、编程语言的使用等。
 软件系统结构因素：如动态库/静态库的组织、外部数据的存储及网络环境等。
软件编程设计因素可以看做是程序的内在本质，一般来说，也是对软件性能影响较大的因素。只有对编程语言、算法和数据结构有深入的了解，才能分析出原因，并且找出解决性能问题的方法。本书将针对C++语言，深入介绍C++程序性能优化的方法和实例。
软件系统的结构因素可以看做是程序的外在形式，它们一般和操作系统紧密相关。尤其是现在的软件系统，由于功能复杂，大都采用组件形式，以最大限度地提高可复用性。因此，一般会包含一些动态库/静态库，这些库的组织也会影响到软件系统的性能。本书将针对Windows和Linux介绍动态库和静态库的基本知识及其对软件系统性能的影响。需要指出的是，上面这个优化的过程需要在软件开发的整个过程中不断地迭代进行。而且开始得越早，出现的性能问题越容易解决。
本书的结构
本书主要针对C++程序的性能优化，由5篇组成。第1篇概述了应用程序性能优化工作的基本概念、总流程和方法论，是对性能优化的全局性介绍。
第2篇介绍C++语言的对象模型，与性能有关的语言特性及一些数据结构的性能，本篇是C++程序优化的基础。
第3篇主要介绍C++程序内存使用的优化。内存无疑是影响程序性能的重要因素，很多程序由于没有采用正确的方法分配和使用内存，不仅占用内存较多，而且运行效率不高。在本篇中将结合一些操作系统的内存管理机制介绍如何在特定的平台下进行内存优化。此外，还将深入介绍C++语言管理动态内存的机制和方法，并介绍一个常用的内存管理方法，即内存池的实现。
第4篇介绍程序启动性能的优化。程序的启动性能不仅受到软件编程设计因素的影响，也会受到系统结构因素的影响，尤其是动态库的影响。本篇将首先介绍动态库的基本知识，然后介绍一些程序启动性能优化的具体方法。
“工欲善其事，必先利其器”，好的工具会大大提高程序性能优化的效率。第5篇将介绍3类性能工具，即内存分析工具、性能分析工具和I/O检测工具，它们是性能测量和分析的利器。
本书适用于有一定C++开发经验的开发人员，也可以作为高等院校相关专业师生的参考书。
致谢
本书是集体创作的结晶，在此感谢大家出色的协作精神。本书的写作也占用了大家大量的休息、娱乐，以及和家人在一起的时间，所以在此感谢作者们家人的理解和支持。同时，在成书的过程中与许多人的关怀、鼓励和支持密不可分，其中包括CDL总裁Josephine，律师Andrew，Director Dennis，资深经理Debbi 和Cindy，研发经理阎小兵和扈晓炜等，在此表示感谢。最后，特别感谢出版社的有关领导、协调人员及编辑，没有他们的支持和参与，本书的出版是不可能的。
由于时间仓促、水平有限，书中难免有许多不妥、甚至错误之处。在此敬请读者不吝指出，我们将愿意与读者共同探讨，并不胜感激。 
目    录
第1篇  应用程序性能优化概述
第1章  应用程序性能优化概述    2
1.1  应用程序性能的定义    2
1.2  性能基准    3
1.2.1  基准负载    3
1.2.2  基准用例    4
1.2.3  性能基准的运行    5
1.2.4  性能基准结果    6
1.3  性能分析方法概述    7
1.4  性能优化方法概述    9
1.5  本章小结    10
第2篇  C++程序优化基础
第2章  C++对象模型    12
2.1  基本概念    12
2.1.1  程序使用内存区    12
2.1.2  全局/静态存储区及常量数据区    15
2.1.3  堆和栈    16
2.1.4  C++中的对象    18
2.2  对象的生命周期    18
2.3  C++对象的内存布局    23
2.3.1  简单对象    23
2.3.2  单继承    26
2.3.3  多继承    29
2.4  构造与析构    38
2.5  本章小结    40
第3章  C++语言特性中的性能分析    41
3.1  构造函数与析构函数    42
3.2  继承与虚拟函数    53
3.3  临时对象    61
3.4  内联函数    75
3.5  本章小结    83
第4章  常用数据结构的性能分析    84
4.1  常用数据结构性能分析    84
4.1.1  遍历    89
4.1.2  插入    91
4.1.3  删除    94
4.1.4  排序    96
4.1.5  查找    100
4.2  动态数组的实现及分析    102
4.2.1  动态数组简介    102
4.2.2  动态数组实践及分析    104
4.3  本章小结    110
第3篇  内存使用优化
第5章  操作系统的内存管理    112
5.1  Windows内存管理    112
5.1.1  使用虚拟内存    113
5.1.2  访问虚拟内存时的处理流程    115
5.1.3  虚拟地址到物理地址的映射    117
5.1.4  虚拟内存空间使用状态记录    120
5.1.5  进程工作集    121
5.1.6  Win32内存相关API    123
5.2  Linux内存管理机制    132
5.2.1  进程的内存布局    133
5.2.2  物理内存管理    135
5.2.3  虚拟内存管理    136
5.2.4  虚拟地址映射为物理地址    137
5.3  本章小结    138
第6章  动态内存管理    139
6.1  operator new/delete    139
6.2  自定义全局operator new/delete    144
6.3  自定义类operator new/delete    148
6.4  避免内存泄漏    151
6.5  智能指针    156
6.6  本章小结    166
第7章  内存池    167
7.1  自定义内存池性能优化的原理    167
7.1.1  默认内存管理函数的不足    167
7.1.2  内存池的定义和分类    168
7.1.3  内存池工作原理示例    168
7.2  一个内存池的实现实例    170
7.2.1  内部构造    170
7.2.2  总体机制    171
7.2.3  细节剖析    174
7.2.4  使用方法    183
7.2.5  性能比较    184
7.3  本章小结    184
第4篇  应用程序启动性能优化
第8章  动态链接与动态库    186
8.1  链接技术的发展    186
8.1.1  编译、链接和加载    187
8.1.2  静态链接与静态链接库    189
8.1.3  动态链接与动态库    195
8.2  Windows DLL，Dynamic Linked Library    196
8.2.1  DLL基础    196
8.2.2  DLL如何工作    200
8.2.3  关于DLL的杂项    208
8.3  Linux DSO    209
8.3.1  DSO与ELF    209
8.3.2  DSO如何工作    217
8.3.3  构建与使用DSO    223
8.4  本章小结    233
第9章  程序启动过程    234
9.1  Win32程序启动过程    234
9.2  Linux程序启动过程    238
9.3  影响程序启动性能的因素    239
9.3.1  源代码因素    240
9.3.2  动态链接库因素    241
9.3.3  配置文件/资源文件因素    247
9.3.4  其他因素    248
9.4  本章小结    250
第10章  程序启动性能优化    251
10.1  优化程序启动性能的步骤    251
10.2  测试程序启动性能的方法    252
10.3  优化可执行文件和库文件    255
10.3.1  减少动态链接库的数量    255
10.3.2  减小动态链接库尺寸    257
10.3.3  优化可执行文件和库文件中的代码布局    257
10.4  优化源代码    259
10.4.1  优化启动时读取的配置文件及帮助文件    259
10.4.2  预读频繁访问的文件    260
10.4.3  清除产生exception的代码    261
10.4.4  PreLoad    262
10.4.5  延迟初始化    262
10.4.6  多线程化启动    263
10.5  本章小结    264
第5篇  性能工具
第11章  内存分析工具
IBM Rational Purify    266
11.1  Rational Purify工作原理    266
11.2  使用Rational Purify来发现内存泄漏    269
11.2.1  内存泄漏及其对应用程序性能的影响    269
11.2.2  用PerfMon来发现Windows系统中有严重后果的内存泄漏    270
11.2.3  用Rational Purify来定位内存泄漏    273
11.2.4  典型的内存泄漏错误    274
11.3  Rational Purify使用指南    277
11.4  Rational Purify实例分析    283
11.5  本章小结    287
第12章  性能分析工具
IBM Rational Quantify    288
12.1  Rational Quantify工作原理    289
12.2  Rational Quantify使用指南    290
12.3  Rational Quantify实例分析    293
12.4  本章小结    297
第13章  实时IO监测工具FileMon    298
13.1  FileMon的工作原理    298
13.2  FileMon使用指南    301
13.3  使用FileMon解决问题    303
13.4  本章小结    306
参考文献    307