第1章 跟踪范例 1
1.1 初步的跟踪实现 2
1.1.1 发生了什么问题 4
1.1.2 恢复计划 6
1.2 要点 9
引言 10
第2章 构造函数和析构函数 10
2.1 继承 11
2.2 合成 21
2.3 缓式构造 23
2.4 冗余构造 26
2.5 要点 30
第3章 虚函数 31
3.1 虚函数的构造 31
3.2 模板和继承 34
3.2.1 硬编码 35
3.2.2 继承 36
3.2.3 模板 37
3.3 要点 38
第4章 返回值优化 39
4.1 按值返回的构造 39
4.2 返回值优化 41
4.3 计算性构造函数 44
4.4 要点 45
第5章 临时对象 46
5.1 对象定义 46
5.2 类型不匹配 47
5.3 按值传递 50
5.4 按值返回 51
5.5 使用op=()消除临时对象 53
5.6 要点 54
6.1 版本0:全局函数new()和delete() 55
第6章 单线程内存池 55
6.2 版本1:专用Rational内存管理器 57
6.3 版本2:固定大小对象的内存池 61
6.4 版本3:单线程可变大小内存管理器 65
6.5 要点 72
第7章 多线程内存池 73
7.1 版本4:实现 73
7.2 版本5:快速锁定 76
7.3 要点 80
第8章 内联基础 81
8.1 什么是内联 81
8.2 方法调用代价 85
8.3 为何使用内联 89
8.4 内联详述 90
8.5 内联虚方法 91
8.6 通过内联获得性能 92
8.7 要点 93
第9章 内联——性能方面的考虑 94
9.1 调用间优化 94
9.2 为何不使用内联 99
9.3 开发阶段和编译时的内联考虑 102
9.4 基于配置的内联 102
9.5 内联规则 106
9.5.1 惟一 106
9.5.2 微小 106
9.6 要点 107
第10章 内联技巧 108
10.1 条件内联 108
10.2 选择性内联 109
10.3 递归内联 111
10.4 对静态局部变量进行内联 115
10.5 与体系结构有关的注意事项:多寄存器集 117
10.6 要点 118
11.1 渐近复杂度 119
第11章 标准模板库 119
11.2 插入 120
11.3 删除 127
11.4 遍历 130
11.5 查找 131
11.6 函数对象 133
11.7 比STL更好 135
11.8 要点 138
第12章 引用计数 139
12.1 实现细节 141
12.2 已存在类 153
12.3 并发引用计数 157
12.4 要点 161
第13章 代码优化 162
13.2 预先计算 164
13.1 缓存 164
13.3 降低灵活性 166
13.4 80-20规则:提高常用路径的速度 166
13.5 缓式计算 170
13.6 无用计算 171
13.7 系统体系结构 172
13.8 内存管理 174
13.9 库和系统调用 175
13.10 编译器优化 177
13.11 要点 178
第14章 设计优化 179
14.1 设计灵活性 179
14.2 缓存 183
14.2.1 Web服务器时间戳 183
14.2.2 数据扩展 183
14.2.3 公用代码陷阱 184
14.3 高效的数据结构 186
14.4 缓式计算 186
14.5 无用计算 190
14.6 失效代码 191
14.7 要点 192
第15章 可伸缩性 193
15.1 SMP体系结构 195
15.2 Amdahl法则 196
15.3 多线程和同步术语 198
15.4 把一个任务分解成多个子任务 199
15.5 缓存共享数据 199
15.6 无共享 202
15.7 部分共享 203
15.8 锁的粒度 205
15.10 Thundering Herd 208
15.9 伪共享 208
15.11 读/写锁 210
15.12 要点 210
第16章 系统体系结构相关性 212
16.1 内存层次 212
16.2 寄存器:内存之王 214
16.3 磁盘和内存结构 217
16.4 缓存影响 220
16.5 缓存颠簸 222
16.6 避免跳转 223
16.7 简单计算胜过小分支 224
16.8 线程影响 225
16.9 上下文切换 227
16.10 内核交叉 229
16.11 线程选择 230
16.12 要点 232
参考文献 233