从现代 C++ 底层内存模型、类型系统与泛型元编程,到手写工业级 LLVM 风格高阶数据结构(SmallVector)的硬核演练场。
cppLabs 是一个系统性、阶梯式的现代 C++(C++17 / C++20)底层原理与工程实战代码仓库。
项目摆脱浮于表面的 API 调用,直击 C++ 在 CPU 缓存、内存布局、对象生命周期、零拷贝抽象与编译期计算 上的底层实现,通过 14 个渐进式 Labs 筑牢内功,并最终落地于 small-vector 工程实践——从零手写支持小对象优化(SSO, Small Size Optimization)的高性能向量容器。
整个仓库由浅入深,分为五大演进模块:
[模块 1: 内存与生命周期基石] (Lab 01-04)
│
▼
[模块 2: 所有权哲学与零拷贝] (Lab 05-07)
│
▼
[模块 3: 泛型、闭包与元编程] (Lab 08-12)
│
▼
[模块 4: 对齐与未初始化内存] (Lab 13-14)
│
▼
[终局实践: 工业级 SmallVector] (small-vector/)
- Lab 01 · 引用与值类别 (
01_references_and_value_categories.cpp):剖析左值 (lvalue)、将亡值 (xvalue)、纯右值 (prvalue),理解临时对象生命周期与引用折叠。 - Lab 02 · RAII 与资源管理 (
02_class_raii_and_explicit.cpp):资源获取即初始化哲学,explicit防止隐式转换陷阱。 - Lab 03 · 三法则与深拷贝 (
03_rule_of_three_deep_copy.cpp):析构、拷贝构造与拷贝赋值三位一体,指针资源的安全深拷贝实现。 - Lab 04 · 五法则与移动语义 (
04_rule_of_five_and_move.cpp):右值引用、std::move资源偷取、移动构造与移动赋值运算符的自赋值安全处理。
- Lab 05 · 多态设计与强类型枚举 (
05_polymorphism_and_enums.cpp):虚函数表 (vtable) 运行时多态机制与enum class类型安全。 - Lab 06 · 智能指针与所有权语义 (
06_smart_pointers_and_ownership.cpp):std::unique_ptr独占所有权、std::shared_ptr控制块引用计数机制与std::weak_ptr循环引用破局。 - Lab 07 · 零拷贝字符串视图 (
07_string_view_and_zero_copy.cpp):基于std::string_view的非拥有型内存切片与零分配高性能字符串解析。
- Lab 08 · Lambda 闭包与零拷贝分词 (
08_lambda_and_closures.cpp):解构编译器为 Lambda 生成的匿名仿函数结构体、值/引用/移动捕获的内存本质与mutable。 - Lab 09 · 模板全特化与偏特化 (
09_templates_and_specialization.cpp):函数/类模板特化规则与编译期模式匹配。 - Lab 10 · 万能引用与完美转发 (
10_universal_reference_and_perfect_forwarding.cpp):T&&引用折叠推导规则与std::forward<T>的类型保真传递。 - Lab 11 · 可变参数模板与折叠表达式 (
11_variadic_templates_and_fold.cpp):形参包展开模式、一元/二元折叠表达式的高性能打印与累加。 - Lab 12 · Type Traits 与 if constexpr (
12_type_traits_and_if_constexpr.cpp):SFINAE、<type_traits>类型反射与 C++17if constexpr编译期静态分支剪枝。
- Lab 13 · 内存对齐与 Padding 优化 (
13_memory_alignment_and_padding.cpp):CPU Cache Line 亲和性、alignas/alignof强制对齐、结构体字段重排防内存膨胀。 - Lab 14 · 手写纯栈上 MyOptional (
14_optional_and_monad.cpp):基于std::byte未初始化栈内存的MyOptional<T>,运用 placement new 手动管理对象生命周期与 Monad 式链式调用 (and_then)。
工业级编译器(如 LLVM / Clang)和图形渲染引擎普遍青睐 SmallVector 容器。它在容量
| 技术维度 | 实现细节 |
|---|---|
| 内存布局 (SSO) |
alignas(alignof(T)) std::byte inline_storage_[N * sizeof(T)] 严格栈对齐,指针 begin_ 灵活在内联缓冲区与堆空间之间切换。 |
| 生命周期安全 | 逆序手动析构元素,严密规避 size_t 无符号下溢导致的死循环与越界崩溃陷阱。 |
| 堆/栈差异化移动 | 堆模式 |
| 平凡类型快路优化 | 借助 if constexpr (std::is_trivially_copyable_v<T>),对基本/平凡类型直接调用 std::memcpy 进行极速内存快拷。 |
| 标准容器 API | 完美转发原位构造 emplace_back(Args&&...)、2 倍几何扩容机制 grow、pop_back、clear、operator[] 及范围 for 循环迭代器接口。 |
| 生命周期严密追踪 | 提供 Tracer 测试类,实时追踪并验证非平凡对象在搬迁、析构和移动时的生命周期状态。 |
.
├── CMakeLists.txt # 根构建配置
├── LICENSE # Apache-2.0 开源协议
├── README.md # 仓库全景介绍
├── cpp_labs/ # 14 个进阶核心实验源码
│ ├── 01_references_and_value_categories.cpp
│ ├── 02_class_raii_and_explicit.cpp
│ ├── 03_rule_of_three_deep_copy.cpp
│ ├── 04_rule_of_five_and_move.cpp
│ ├── 05_polymorphism_and_enums.cpp
│ ├── 06_smart_pointers_and_ownership.cpp
│ ├── 07_string_view_and_zero_copy.cpp
│ ├── 08_lambda_and_closures.cpp
│ ├── 09_templates_and_specialization.cpp
│ ├── 10_universal_reference_and_perfect_forwarding.cpp
│ ├── 11_variadic_templates_and_fold.cpp
│ ├── 12_type_traits_and_if_constexpr.cpp
│ ├── 13_memory_alignment_and_padding.cpp
│ ├── 14_optional_and_monad.cpp
│ └── CMakeLists.txt # 实验子工程构建配置
├── small-vector/ # 工业级 SmallVector 终局项目
│ ├── CMakeLists.txt # C++20 构建配置
│ ├── smallvector.h # 完整的 SmallVector 模板类实现
│ └── test_smallvector.cpp # 单元测试与 Tracer 生命周期验证
└── documents/ # 核心技术文档与学习记录沉淀
├── cpp_learning_conversation_history.md # 完整实验历程与深度答疑记录
├── cpp_reference_and_forwarding_qa.md # 引用折叠与完美转发专项讲义
└── cpp_variadic_pack_expansion_guide.md # 形参包展开模式与折叠表达式手册
- 编译器:支持 C++20 的编译器(GCC 10+ 或 Clang 11+)
- 构建工具:CMake 3.15+
cd small-vector
mkdir -p build && cd build
cmake ..
make
./testsmallvectorcd cpp_labs
mkdir -p build && cd build
cmake ..
make
# 运行指定实验(例如 Lab 14)
./14labg++ -std=c++20 -Wall -Wextra cpp_labs/13_memory_alignment_and_padding.cpp -o lab13 && ./lab13本项目基于 Apache License 2.0 协议开源。