CONTENTS / 18 + 34 CHAPTERS
一条主线,八个分册。
从基础01–18开始,再依次阅读19–52章。M1、完整G0与三座先备桥的位置由同一份路线安排。
C++ 基础与工程
- 01第一份程序:保存、编译与顺序执行5h · 含动手
从终端和纯文本文件开始,逐个读懂第一份C++程序,再用两个小整数例子解释初始化、赋值、独立副本与重新编译。
- 02类型与表达式:先运算,再保存6h · 含动手
从类型和字面量出发,亲手预测整数除法、初始化、转换时机、const和标量auto,最后区分无符号回绕、有符号越界与浮点舍入。
- 03控制流:选择与重复10h · 含动手
先读懂条件、分支和循环的下一步,再独立完成半开区间累计与偶数计数,追踪短路、更新和提前退出。
- 04普通函数:参数、调用与返回8h · 含动手
沿着一次调用追踪形参、返回值与调用者,练习默认实参、简单重载和有范围的计数函数。
- 05引用与const:副本和同一个对象7h · 含动手
用具名整数追踪别名、参数写回、只读路径与借用有效期;从状态变化理解auto和局部返回。
- 06指针:地址、空值与有效访问7h · 含动手
分清改目标与改指向,跟踪指针副本、可选借用、const分层和最后一次合法访问。
- 07类与对象:状态、接口和销毁顺序8h · 含动手
把状态和允许的操作放进同一个类型,追踪初始化、失败不变和正常退出时的销毁过程。
- 08拥有一组数据:array、vector与string13h · 含动手
从类型实参和合法下标开始,区分元素数量与预留容量,再用独立复制和溢出前检查建立可靠的序列操作。
- 09遍历与借用:范围、视图与失效9h · 含动手
用同一组读数比较下标、迭代器与范围for;让视图借用已有元素,再逐步判断存活、长度、重分配和记录身份。
- 10算法与lambda:表达处理意图9h · 含动手
从手动计数走到查找、排序、累计和谓词;分清调用时机、闭包持有的状态,以及算法怎样修改元素或范围。
- 11关联容器与适配器:查找、唯一性与访问顺序9h · 含动手
先识别一对值与绑定方式,再区分按键查询、插入和计数;用同一批小任务比较有序集合、哈希表、双端容器、队列与栈。
- 12复制与移动:追踪对象、调用与结果7h · 含动手
先区分表达式类别、const和对象寿命,再预测复制/移动构造与赋值;用标量日志和容器值理解std::move、返回值与Rule of Zero。
- 13真实资源与RAII:独占拥有8h · 含动手
追踪new创建的真实对象由谁释放,再用unique_ptr管理正常退出、提前返回、转交和接口接管;分清空拥有者、有效借用与释放责任。
- 14共享拥有与回调寿命6h · 含动手
用最后一个强拥有者、weak_ptr的lock以及回调自带的状态,判断对象何时仍可用;再检查C++20 std::function的空状态和可复制目标要求。
- 15定义模板与concepts9h · 含动手
从会填模板实参走到定义模板,按实参推导、编译期分支与约束选择可用接口;再用转发引用解释泛型调用如何保留表达式类别。
- 16错误处理与输入解析10h · 含动手
把合法零、没有值和失败分开传递:先从输入得到经过完整检查的候选值,再提交修改;用真实资源观察异常展开,并判断noexcept承诺怎样影响明确的移动选择。
- 17多文件编译、链接与构建6h · 含动手
把头文件、实现与main组成真正的项目,沿预处理、编译、汇编、链接追踪产物;亲自制造缺定义和重复入口的链接错误,再用明确目标与可复现命令恢复。
- 18测试与调试:独立定位失败5.5h · 含动手
从独立期望与实际检查次数开始,用同一处整数除法错误练习失败退出、LLDB定位、改源重编译和边界复测;分清断言被移除与检查真正执行。
数据结构与算法
Linux 与并发系统
- 23进程、系统调用与文件描述符60分钟阅读
为什么一次 read 不能保证拿到完整数据,子进程又怎样把结果交回父进程?
- 24虚拟内存、页表与 mmap60分钟阅读
一块连续的虚拟地址,为什么不要求连续的物理内存?
- 25线程、互斥锁与死锁60分钟阅读
两个线程各做一千次加法,为什么结果与安全性都不能只靠一次运行判断?
- 26条件变量、有界队列与关闭协议60分钟阅读
队列为空时消费者应该等什么,服务关闭后又怎样保证所有等待者能退出?
- 27原子操作与 happens-before60分钟阅读
为什么计数用 relaxed 可以,而用 relaxed 发布普通对象却不够?
- 28TCP 字节流、分包、超时与背压60分钟阅读
两次 send 为什么可能变成三次 recv,如何写出不会无界等待的接收器?
架构、性能与并行
- 29CPU cache、缓存一致性与 SIMD60分钟阅读
同样读八个整数,为什么地址布局会改变需要接触的缓存行数?
- 30可信测量、原始样本与性能模型60分钟阅读
一次最快的耗时能代表改进吗,如何把瓶颈假设变成可复查的实验?
- 31并行分解、分块与负载均衡60分钟阅读
十个元素分给三个线程,怎样证明没有漏算、重算和越界?
- 32Reduction、scan 与数值正确性60分钟阅读
求一个总和与求每个前缀为什么是不同算法,浮点结果又为何可能随顺序变化?
- 33Host/device、传输与异步生命周期60分钟阅读
launch 返回后能否立即读结果,为什么数据留在设备上可能比优化一条指令更有效?
- 34Kernel 索引、边界与 grid-stride loop60分钟阅读
启动十二个线程处理十个元素,剩下两个线程该做什么?
- 35合并访问、共享内存与同步范围60分钟阅读
为什么线程访问相邻地址很重要,shared memory 又为什么必须配合分阶段同步?
- 36Tensor shape、stride 与 GEMM 分块60分钟阅读
转置一定要复制数据吗,矩阵乘法如何通过tile复用减少搬运?