第一篇 新手篇 2
第1章 C语言概述 2
1.1C语言的前世今生 2
1.2C语言的优势与劣势 3
1.3C语言的当前标准 4
1.4C语言的编程机制 4
第2章 C语言的骨骼——基础数据类型 6
2.1常量与变量 6
2.1.1常量 6
2.1.2变量 8
2.2关键字和保留标识符 9
2.3整数类型 11
2.4浮点类型 11
2.5字符和字符串类型 13
2.6类型之间的转换 14
2.7程序注释 18
第3章 C语言的肉身——运算符 20
3.1算术运算符 20
3.2赋值运算符 21
3.3逻辑运算符 21
3.4移位运算符 22
3.5关系运算符 23
3.6增量运算符 24
3.7位运算符 25
3.8条件运算符 26
3.9逗号运算符 27
3.10运算符的优先级 28
第4章 C语言的血液——控制流 30
4.1顺序流 30
4.2条件分支流 31
4.3循环控制流 35
4.4输入输出流 38
4.4.1scanf/rintf函数 38
4.4.2getchar/putchar函数 40
4.4.3gets/puts函数 41
4.5语句嵌套 42
第5章 C语言的灵魂——函数 44
5.1函数定义 44
5.2函数声明 45
5.3函数参数 46
5.4函数调用 48
5.5函数递归 52
5.6可变参数列表 54
第6章 丫丫学步——构建第一个程序 56
6.1main函数 56
6.2程序风格 58
6.3第一个C程序 60
6.4编译执行 61
第二篇 进阶篇 64
第7章 成长的烦恼——数组和指针 64
7.1一维数组 64
7.2多维数组 65
7.3变长数组 66
7.4指针与地址 68
7.5指针数组 71
7.6指向函数的指针 73
7.7指向指针的指针 74
7.8指针和数组的区别 75
第8章 成长的积累——结构体、联合体及其他数据形式 77
8.1结构体基础知识 77
8.2结构的存储与对齐 79
8.3结构数组 84
8.4指向结构的指针 85
8.5结构体自引用 87
8.6联合体基础知识 88
8.7枚举类型 90
8.8位字段 93
8.9typedef简介 95
第9章 成长的惊喜——预处理器 98
9.1宏定义 98
9.2文件包含 102
9.3条件编译 103
第10章 成人礼——第一次构建多文件工程 107
10.1多源文件编译 107
10.2动态库和静态库 113
10.2.1静态库 114
10.2.2动态库 115
第三篇 实战篇 120
第11章 骨骼的发育——经典数据结构 120
11.1栈 120
11.2链表 123
11.3队列 126
11.4树 129
11.5堆 134
11.6散列表 137
11.7图 139
11.7.1邻接矩阵 141
11.7.2邻接表 142
11.7.3十字链表 142
11.7.4邻接多重表 143
11.8一个具体的例子——协议识别引擎 144
第12章 社会经验的积累——经典设计模式 151
12.1程序设计理念 151
12.2设计模式原则 152
12.3单件模式 154
12.4工厂模式 157
12.5抽象工厂模式 158
12.6创建者模式 161
12.7原型模式 162
12.8适配器模式 163
12.9装饰器模式 164
12.10代理模式 166
12.11外观模式 167
12.12桥接模式 169
12.13组合模式 170
12.14享元模式 172
12.15策略模式 174
12.16模板方法模式 175
12.17观察者模式 177
12.18迭代器模式 179
12.19责任链模式 180
12.20命令模式 182
12.21备忘录模式 183
12.22状态模式 185
12.23访问者模式 186
12.24中介者模式 188
12.25解释器模式 190
第13章 成长的挫折——再论程序调试 194
13.1断言 194
13.2万能的打印 197
13.3GDB调试浅谈 199
13.3.1基础命令 199
13.3.2进阶多线程命令 205
13.3.3调试core文件 206
13.4符号表与反汇编 210
13.5core文件的配置 212
第14章 适应社会——可移植性 214
14.1为什么需要可移植 214
14.2如何设计可移植的数据结构 215
14.3如何设计可移植的程序 217
第四篇 高手篇 220
第15章 找出自身的不足——性能调试 220
15.1程序Cycle的意义 220
15.2性能测试工具的使用 221
15.3变量的优化 224
15.4高性能函数 228
15.5嵌入式汇编 234
15.6编译优化 237
第16章 做事需未雨绸缪——Cache技术 241
16.1为什么要使用Cache 241
16.2Cache有多少级 242
16.3Cache Line的介绍 244
16.4与Cache结合的CPU指令 246
16.5Cache的淘汰策略 250
16.6让程序爱上Cache 252
第17章 找到亲近的人与事——NUMA技术 254
17.1NUMA简介 254
17.2NUMA存储管理 257
17.3NUMA相关工具 258
17.4NUMA读写实测 260
17.5让程序爱上NUMA 261
第18章 社会更新换代——大页技术 262
18.1大页简介 262
18.2Linux如何配置大页 263
18.3简述Hugetlbfs实现 266
18.4程序如何使用大页 269
第19章 自我修炼——多线程技术 271
19.1进程与线程的区别 271
19.2多线程编程 275
19.2.1线程的创建和结束 275
19.2.2线程同步 277
19.2.3线程互斥 281
19.2.4定义线程独有变量 283
19.3CPU亲和性 284
19.3.1RTC模式 287
19.3.2Pipeline模式 288
19.4多线程调试 289
附录A 术语表 291
附录B 操作符优先级表 293
附录C Linux信号表 298