第1章 绪论 1
1.1 计算机系统初探 2
1.1.1 换个角度看计算机 2
1.1.2 CPU很好很强大 4
1.2 计算机语言与编译技术 8
1.2.1 如何让机器理解你 8
1.2.2 编译技术与开发环境 14
1.2.3 程序开发流程 20
1.3 C语言神话 22
1.3.1 C语言的历史 22
1.3.2 简单说说C语言的特点 23
1.4 奇迹的延续 25
1.4.1 C++的产生与发展 25
1.4.2 C++与面向对象思想 27
1.5 本章小结 31
第2章 揭开数据表示的面纱 32
2.1 进制系统 33
2.1.1 最简单的计数方式 33
2.1.2 计算机里只有黑白 34
2.1.3 压缩表示的二进制 36
2.2 位与位操作 38
2.2.1 计算机存储的单位 38
2.2.2 位操作和位段 39
2.3 计算机中的数值 48
2.3.1 一种最简单的数 48
2.3.2 现实世界需要负数 49
2.3.3 只有整数还不够 51
2.4 让计算机学会写字 56
2.4.1 ASCII码 57
2.4.2 汉字编码 59
2.4.3 更强大的编码 60
2.5 C语言基本数据类型 62
2.5.1 整型 63
2.5.2 字符型 66
2.5.3 注意浮点数陷阱 67
2.6 本章小结 71
第3章 变量与地址 72
3.1 程序都在内存中 73
3.2 很多初学者都怕指针 77
3.3 睁大眼睛看内存 81
3.4 数组与指针是近亲 84
3.5 再谈指针 93
3.6 本章小结 97
第4章 动态内存管理 98
4.1 malloc和free 99
4.2 sizeof并不复杂 101
4.3 内存操作函数 105
4.3.1 memset 105
4.3.2 memcpy和memmove 107
4.4 new和delete 109
4.5 内存错误面面观 113
4.5.1 最怕内存泄漏 113
4.5.2 小心重复释放 115
4.5.3 指针是个坏东西 117
4.5.4 超量写内存 118
4.6 使用Visual C++检查内存泄漏 120
4.7 本章小结 124
第5章 代码与指令系统 125
5.1 还原代码的本来面目 126
5.1.1 内存中的代码 126
5.1.2 指向函数的指针 131
5.1.3 CPU的存储器 136
5.1.4 寄存器变量 143
5.1.5 寄存器组举例 145
5.2 指令——简单or复杂 149
5.2.1 指令格式 149
5.2.2 操作类型 154
5.2.3 操作数类型 155
5.3 如何找到地址 156
5.3.1 下一步该做什么 156
5.3.2 计算机知道自己需要什么 165
5.4 本章小结 172
第6章 函数与函数调用 173
6.1 函数与参数 174
6.1.1 C/C++中的函数 174
6.1.2 参数传递 174
6.1.3 作用域 180
6.2 函数的递归调用 184
6.2.1 到处都是递归 184
6.2.2 小心使用递归 188
6.2.3 递归与非递归 194
6.2.4 内、外部变量分配原理 198
6.3 内存的使用 200
6.3.1 活动记录与栈 200
6.3.2 静态分配 203
6.3.3 有静就有动 205
6.4 程序在内存中的模样 217
6.5 本章小结 219
第7章 多级存储系统 221
7.1 存储系统及层级结构 222
7.1.1 存储器分类 222
7.1.2 存储器的层级结构 225
7.1.3 访问的局部性原理 227
7.1.4 再谈存储器的层级 231
7.2 高速缓存 235
7.2.1 缓存设计策略 235
7.2.2 多级缓存原理 245
7.2.3 实际编码指导 250
7.3 虚拟内存 258
7.3.1 何为虚拟内存 259
7.3.2 虚拟地址 262
7.3.3 页面请求与磁盘缓冲 269
7.3.4 工作集合与系统颠簸 274
7.3.5 虚拟内存与性能影响 276
7.4 本章小结 278
第8章 操作系统交互 279
8.1 多任务 280
8.1.1 串行与并行 280
8.1.2 多任务的实现 282
8.1.3 并发程序设计 283
8.2 进程 284
8.2.1 进程的概念 284
8.2.2 进程的状态 285
8.2.3 进程控制块 288
8.3 Win32进程编程 289
8.3.1 创建进程 289
8.3.2 环境变量 299
8.4 线程 301
8.4.1 线程的概念 301
8.4.2 多线程 302
8.4.3 超线程 303
8.4.4 线程池 304
8.5 调度 305
8.5.1 处理器的调度 305
8.5.2 调度算法准则 306
8.5.3 常见的调度算法 308
8.6 Win32线程编程 313
8.6.1 创建和退出线程 313
8.6.2 挂起和恢复线程 317
8.6.3 远程线程的注入 320
8.7 本章小结 329
第9章 瓶颈与优化 330
9.1 优化还是不优化 331
9.2 测量与分析的内容 333
9.3 测量与分析的方法 334
9.3.1 使用计时器 334
9.3.2 使用Profile 341
9.3.3 使用性能监视器 349
9.4 基本规律 350
9.4.1 二八法则 350
9.4.2 安达尔定律 351
9.5 程序优化路线 354
9.5.1 优化实践的经典案例 354
9.5.2 优化案例的启示 355
9.6 编译器不是万能的 357
9.7 实际优化建议 360
9.7.1 循环条件中的低效 361
9.7.2 注意字符串的操作 363
9.7.3 权衡函数调用需求 364
9.7.4 转换指针形式代码 366
9.7.5 检查存储器的访问 367
9.7.6 使用循环展开技术 372
9.7.7 查表替换复杂运算 375
9.7.8 耗时计算移出循环 377
9.8 本章小结 378
附录A 浅谈编程能力的培养与提高 379
附录B 程序人生 397
参考文献 414