C/C++ 完整知识体系
定位:面向 Java/Kotlin 深度开发者的 C/C++ 从入门到专家知识体系。
本体系不追求面面俱到的 API 罗列,而是围绕 Java/Kotlin 开发者转型时的认知鸿沟 构建,每个知识点都回答一个核心问题:"和 Java/Kotlin 有什么本质不同,为什么?"
难度级别说明
| 级别 | 代号 | 含义 | 对应 Java/Kotlin 经验要求 |
|---|---|---|---|
| L1 | 入门 | 理解基本概念,能读懂代码 | 无 C++ 经验即可 |
| L2 | 基础 | 能独立编写正确的小程序 | 需要理解 C++ 与 Java 的根本差异 |
| L3 | 进阶 | 能设计模块、理解性能含义 | 需要扎实的 C++ 基础 |
| L4 | 高级 | 能做架构决策、性能优化 | 需要项目实战经验 |
| L5 | 专家 | 理解语言实现细节,能做极限优化 | 需要深入理解编译器与硬件 |
学习路径
Phase 1 生存 ──► Phase 2 胜任 ──► Phase 3 精通 ──► Phase 4 专家
(L1-L2) (L2-L3) (L3-L4) (L4-L5)
2-4 周 4-8 周 8-16 周 持续积累
Phase 1:生存 (L1-L2) — "能写、能编译、不崩"
目标:建立正确的心理模型,避免最常见的坑。
| 主题 | 核心问题 | 关键认知 |
|---|---|---|
| 环境搭建 | 怎么编译运行? | 编译器、构建系统、调试器 |
| 基础语法差异 | 和 Java 有什么不同? | 头文件、命名空间、自由函数 |
| RAII 与智能指针 | 没有 GC 怎么管内存? | 资源获取即初始化,确定性销毁 |
| 标准库容器 | 用什么代替 ArrayList/HashMap? | std::vector、std::map、std::unordered_map |
| 错误处理 | 没有 checked exception? | 异常机制、std::optional、std::expected |
Phase 2:胜任 (L2-L3) — "写得好、跑得快"
目标:理解 C++ 的性能优势来源,写出高效且安全的代码。
| 主题 | 核心问题 | 关键认知 |
|---|---|---|
| 移动语义 | 为什么 C++ 能比 Java 快? | 右值引用、完美转发、零成本抽象 |
| 模板基础 | 泛型怎么写? | 函数模板、类模板、SFINAE 入门 |
| 并发基础 | 多线程怎么安全写? | std::thread、std::mutex、std::atomic |
| 内存模型 | 多线程到底发生了什么? | happens-before、sequenced-before |
| 性能分析 | 怎么证明快? | perf、Valgrind、编译器优化级别 |
Phase 3:精通 (L3-L4) — "架构级决策"
目标:能主导大型 C++ 项目的技术决策。
| 主题 | 核心问题 | 关键认知 |
|---|---|---|
| 模板进阶 | 模板还能这么用? | 变参模板、折叠表达式、CRTP |
| Concepts | 怎么约束模板参数? | C++20 Concepts、requires 子句 |
| Ranges | 怎么优雅地处理数据管道? | 视图、动作、管道操作符 |
| 高级并发 | 超越 mutex? | 无锁数据结构、std::jthread、std::stop_token |
| 大型项目架构 | 怎么组织百万行代码? | CMake 进阶、依赖管理、ABI 稳定性 |
Phase 4:专家 (L4-L5) — "语言级深度"
目标:理解语言实现机制,做极限性能优化。
| 主题 | 核心问题 | 关键认知 |
|---|---|---|
| 模板元编程 | 编译期计算? | constexpr、类型列表、编译期算法 |
| 协程深度 | C++20 协程底层? | 协程状态机、自定义 promise_type |
| 无锁编程 | 极致并发性能? | CAS、ABA 问题、内存序 |
| 编译器内部 | 编译器到底做了什么? | AST、IR、优化 Pass |
| 领域优化 | 针对特定场景的极致优化 | SIMD、缓存优化、分配器定制 |
编译环境搭建
Linux (Ubuntu/Debian)
sudo apt update
sudo apt install g++ cmake build-essential gdb
macOS
xcode-select --install
brew install cmake
Windows
- 安装 Visual Studio Build Tools
- 安装时勾选 "C++ 桌面开发" 工作负载
- 安装 CMake
验证安装
g++ --version # 确认 g++ 可用(macOS 可用 clang++ 替代)
cmake --version # 确认 cmake 可用
编译命令模板
# 基础编译(C++23 标准,全警告,O2 优化)
g++ -std=c++23 -Wall -Wextra -O2 example.cpp -o example && ./example
# 启用并发支持
g++ -std=c++23 -Wall -Wextra -O2 -pthread concurrent_example.cpp -o concurrent_example && ./concurrent_example
# 启用地址清理器(检测内存错误)
g++ -std=c++23 -Wall -Wextra -g -fsanitize=address example.cpp -o example && ./example
# 启用未定义行为清理器
g++ -std=c++23 -Wall -Wextra -g -fsanitize=undefined example.cpp -o example && ./example
# 调试模式(无优化,带调试信息)
g++ -std=c++23 -Wall -Wextra -g -O0 example.cpp -o example && gdb ./example
macOS 用户注意:将
g++替换为clang++,macOS 默认使用 Clang 编译器,同样支持 C++23。
文档导航
| # | 文件 | 主题 | 级别 | 简介 |
|---|---|---|---|---|
| 00 | README | 知识体系总览 | — | 学习路径、环境搭建、文档导航 |
| 01 | 根本差异 | C++ 与 Java/Kotlin 的根本差异 | L1-L2 | 编译模型、内存模型、UB、类型系统——建立正确心理模型的基石 |
| 02 | RAII 与资源管理 | RAII 与智能指针 | L1-L2 | 没有 GC 的世界里,如何安全地管理所有资源 |
| 03 | 标准库容器与算法 | 标准库容器与算法 | L1-L2 | vector/map/unordered_map/算法库,替代 Java Collections |
| 04 | 错误处理 | 错误处理 | L2 | 异常、optional、expected、错误码策略 |
| 05 | 移动语义与值语义 | 移动语义与值语义 | L2-L3 | 右值引用、完美转发、零成本抽象的核心 |
| 06 | 模板编程 | 模板编程 | L2-L4 | 从基础模板到变参模板、SFINAE、Concepts |
| 07 | 并发编程 | 并发编程 | L2-L4 | 线程、互斥锁、原子操作、内存模型、无锁编程 |
| 08 | 性能分析与优化 | 性能分析与优化 | L3-L4 | 工具链、编译器优化、缓存、SIMD |
| 09 | 现代 C++ 特性 | 现代 C++ 特性 | L2-L3 | Ranges、Coroutines、Modules、constexpr |
| 10 | 大型项目架构 | 大型项目架构 | L3-L4 | CMake、依赖管理、ABI、头文件管理 |
| 11 | 模板元编程 | 模板元编程 | L4-L5 | 编译期计算、类型操纵、编译期算法 |
| 12 | 专家主题 | 专家主题 | L4-L5 | 编译器内部、极限优化、领域特定技术 |