🔧 C++ 学习路线
105 个互动教程
C++ 入门 — 高性能编程基石
C++:C 超集,面向对象+泛型,游戏/量化/系统底层
C++ 文件流
fstream/ifstream/ofstream 读写文件
C++ 字符串操作
学习C++中C++ 字符串操作 — C++教程的详细用法和最佳实践
C++ std::vector
动态数组:push_back/size/迭代
C++ 类
学习class
C++ STL 容器 — vector/map/set
STL:vector 动态数组、map 字典、algorithm 算法
C++ 模板
template<typename T> 泛型编程
C++ 迭代器
学习C++中C++ 迭代器 — C++教程的详细用法和最佳实践
C++ Lambda
[capture](params)->ret{body}
C++ 异常处理
try/throw/catch + 标准异常类
C++ 移动语义
std::move 避免深拷贝
C++ 智能指针
unique_ptr/shared_ptr/weak_ptr
C++ 多线程
std::thread + mutex + lock_guard
C++ algorithm 算法库
sort/unique/find/count/accumulate
C++ 引用
& 引用 vs 指针、左值/右值引用
C++ 构造函数
学习构造函数
C++ 面向对象
class/构造析构/继承多态/虚函数/抽象类
std::shared_mutex 读写锁
学习 shared_mutex 实现读共享、写独占的并发控制。
std::chrono 时间库
掌握现代 C++ 时间点、时长与时钟的用法。
std::deque 双端队列
了解双端队列在两端高效插入/删除的特性。
C++ 并发编程 async/future
C++并发:std::async异步任务、std::future/std::promise、std::packaged_task、std::shared_future多个等待者、std::launch::async/deferred策略
C++20 三路比较运算符
<=>太空船运算符:三种排序类别(strong_ordering/weak_ordering/partial_ordering)、auto生成比较运算符、与std::sort配合、自定义类型实现
C++17 variant 与 optional
std::variant类型安全联合体、std::visit访问、std::get/std::get_if提取、std::optional可选值(替代null/None)、std::monostate空状态
C++ constexpr 编译期计算进阶
constexpr进阶:constexpr函数限制逐渐放宽(C++11/14/17/20)、constexpr容器(vector在C++20)、constexpr new(C++20)、consteval立即函数
C++ 智能指针深入
C++智能指针深入:unique_ptr独占所有权(move-only/自定义删除器)、shared_ptr共享所有权(控制块/引用计数/循环引用)、weak_ptr打破循环/观察者模式、make_unique/make_shared
C++ 模板元编程
模板元编程:SFINAE替换失败非错误(enable_if/void_t)、变参模板Variadic Templates参数包展开、折叠表达式fold expression(C++17)、if constexpr编译时分支(C++17)、requires(C++20)
C++ 常用设计模式实现
C++设计模式:RAII资源获取即初始化(智能指针/scoped_lock)、PIMPL模式隐藏实现细节/减少编译依赖、CRTP奇异递归模板模式静态多态、Observer观察者模式
C++ 原子操作与内存序
C++原子操作:std::atomic<T>无锁编程、内存序memory_order(relaxed/acquire/release/seq_cst)、CAS(compare_exchange_strong/weak)实现无锁数据结构、happens-before关系
C++ Sanitizers 代码检测
Clang/GCC Sanitizers:AddressSanitizer(ASan堆栈溢出/use-after-free)、UndefinedBehaviorSanitizer(UBSan未定义行为)、ThreadSanitizer(TSan数据竞争)、MemorySanitizer未初始化读取
C++ 自定义内存分配器
C++ Allocator:std::allocator默认分配器、自定义分配器(内存池/pool allocator/arena allocator)、pmr多态内存资源(C++17/memory_resource/monotonic_buffer_resource)
C++17 文件系统库
C++17 filesystem:std::filesystem::path路径操作、create_directory/create_directories、copy/remove/rename、recursive_directory_iterator递归遍历、file_size/last_write_time、与boost.filesystem对比
C++17 any/optional/variant
C++17三种安全类型:std::any任意类型存储(类似void*但安全)、std::optional可空值(替代nullptr/-1哨兵值)、std::variant类型安全联合体(替代union)、适用场景对比
C++20 指定初始化器
C++20指定初始化器(Designated Initializers):.field=value语法指定初始化struct成员、必须按声明顺序赋予、与C99指定初始化器的区别(不支持乱序/数组/嵌套)、聚合初始化改进
C++20 Ranges Views 深入
Ranges Views深入:views::iota生成序列/views::take/views::drop/views::filter/views::transform/views::join展平/views::split分割/自定义view、pipe组合、惰性求值避免拷贝
C++20 span 视图
C++20 std::span:不拥有数据的连续内存视图(类似string_view但泛型/支持修改)、span<T>/span<const T>、静态范围static extent vs动态范围dynamic extent、替代指针+长度的安全接口、subspan子视图
C++23 std::expected 错误处理
C++23 std::expected<T,E>:函数式错误处理(类似Rust Result/Haskell Either)、value()获取值/error()获取错误、and_then/or_else/transform/transform_error单子操作、std::unexpected异常值、替代异常/错误码
C++23 std::stacktrace 调用栈
C++23 std::stacktrace(调试神器):stacktrace::current()获取当前调用栈、stacktrace_entry(source_file/source_line/description)、打印调用栈to_string/operator<<、断言/异常/日志中嵌入调用栈
C++20 constexpr 容器
C++20 constexpr容器革命:constexpr vector/string(编译期动态分配/需在常量表达式结束时释放)、constexpr new/delete、编译期排序/去重/单词统计、constexpr算法全部可用
C++20 std::source_location
C++20 source_location(编译时获取代码位置信息):替代__FILE__/__LINE__/__FUNCTION__宏、source_location::current()静态方法、.file_name()/.line()/.column()/.function_name()、更好的日志库实现
std::partition 分区算法
学习用 partition 将容器元素按条件分为两组。
C++23 std::mdspan 多维视图
C++23 mdspan多维数组视图(不拥有数据/类似span的多维版):extents定义维度/布局Layout(行主序/列主序)/访问运算符(i,j)、与BLAS/LAPACK库集成、替代vector<vector<T>>(连续内存/无二次分配)
C++23 std::print 现代打印
C++23 std::print/println(类型安全的现代打印/替代printf/cout):print('Hello {}!',name)、格式字符串编译时验证、输出到FILE*或stdout、比cout运算符<<更简洁/比printf类型安全
C++ type_traits 类型特征
C++ type_traits类型特征:编译时查询类型信息(is_integral/is_floating_point/is_pointer/is_class/is_enum/is_same/is_base_of/is_convertible/is_constructible)、类型变换(remove_const/remove_reference/add_pointer/decay/conditi
C++20 Ranges 算法 | 管道风格
Ranges算法(std::ranges命名空间/直接接受range不需要begin/end):ranges::sort/ find/ count/ copy/ transform/ for_each/ any_of/all_of/none_of、Projection投影(lambda作为第四参数/编译时选择字段)、与管道适配器组合ranges::to<vector>()(C++23)
C++23 [[assume]] 属性
C++23 [[assume(condition)]]编译器优化假设断言(类似__builtin_assume/__assume):告知编译器condition在运行时一定为true(产生更优化的代码但错误假设导致未定义行为UB/用于性能关键路径优化)、与assert区别(debug检查 vs 优化提示)
C++23 optional 单子操作
C++23 std::optional单子操作:.and_then(f)(成功则继续计算返回optional<T>)/.or_else(f)(失败换用备选值返回optional<T>)/.transform(f)(成功映射转换值类型,变换T→U),链式错误处理优雅模式
C++23 views pipe 深入
C++23 ranges views管道深入:views::adjacent/views::adjacent_transform相邻元素、views::slide滑动窗口、views::enumerate枚举索引元素对、views::zip/zip_transform多范围并行迭代压缩、views::as_const常量视图、views::cartesian_product笛卡尔积
std::priority_queue 堆
掌握优先队列(最大堆/最小堆)的基本操作。
C++ Concepts:模板约束的现代化
学习如何使用C++20概念对模板参数进行精确约束,提升代码可读性和错误提示质量。
C++20 协程:异步编程新范式
理解协程的基本概念、co_await、co_yield和co_return的用法,并构建简单的生成器。
C++20 Ranges:声明式数据管道
学习使用范围库进行惰性求值、视图组合和算法管道操作,告别传统迭代器。
C++ 入门 — 开发环境与第一个程序
C++简介、编译器安装(g++/MinGW/MSVC)、IDE选择(VS Code/CLion/Visual Studio)、第一个Hello World程序、编译运行流程
C++20 std::format:类型安全的字符串格式化
掌握std::format的语法、占位符、格式说明符,替代printf和iostream。
C++ 输入输出 — cin/cout
C++标准输入输出:cout输出(<<运算符/endl换行/setw格式化)、cin输入、getline读取整行、iomanip格式化(fixed/setprecision)、文件重定向
C++20 std::span:非拥有型数组视图
学习使用span作为连续序列的轻量级抽象,避免指针和数组退化问题。
C++ string 字符串类
C++ string类:构造/赋值/拼接/比较、length/size、substr/find/replace、getline读取、to_string数值转字符串、stoi/stod字符串转数值、C风格字符串对比
C++17 std::variant:类型安全的联合体
理解variant的构造、访问和访问者模式,替代传统union和类型擦除。
C++17 std::optional:优雅处理可能缺失的值
学习optional的构造、访问和错误处理,替代指针或哨兵值表示可选结果。
C++17 std::string_view:高效的字符串引用
掌握string_view的用法、优势及注意事项,避免不必要的字符串拷贝。
C++ STL 算法库 algorithm
STL算法:sort排序(自定义比较)、find/find_if查找、count/count_if计数、copy复制、transform转换、remove/remove_if+erase删除、for_each遍历、lambda表达式
C++20 三向比较:太空船运算符
学习operator<=>和std::compare_three_way,自动生成比较运算符。
C++ 面向对象:构造函数与析构函数
C++构造/析构:默认/有参/拷贝/移动构造函数、初始化列表(:)、析构函数、=default/=delete、RAII资源管理思想、explicit防止隐式转换
C++20 模块:现代化组件系统
学习使用import和export关键字组织代码,替代传统头文件。
C++ 智能指针详解
C++智能指针:unique_ptr(独占所有权/移动语义)、shared_ptr(共享所有权/引用计数/control block)、weak_ptr(打破循环引用/不增加计数)、make_unique/make_shared
C++ 移动语义与右值引用
C++11移动语义:左值/右值/将亡值、std::move、移动构造函数/移动赋值运算符、noexcept规范、完美转发std::forward、emplace_back高效构造
C++ 异常安全保证
C++异常安全:基本保证/强保证/不抛出保证(noexcept)、RAII资源管理防止泄漏、拷贝交换惯用法copy-and-swap、异常规范、std::exception_ptr传递异常
基于模板元编程的静态反射机制
利用模板特化与宏的组合,在编译期模拟结构体字段名与类型的映射,实现类似反射的字段遍历与序列化。
协程驱动的后台任务调度器
使用C++20无栈协程实现一个轻量级任务系统,支持异步延迟、取消与优先级调度,不依赖外部线程池。
std::variant驱动的编译期多态
避免虚函数开销,利用variant+visit+overloaded模式实现类型安全的异构容器与算法分发。
编译期数学库:consteval与常量求值
利用consteval与constexpr在编译期实现三角函数、平方根等函数,用于静态数组长度或模板参数。
定制化内存池:小对象分配器
实现固定大小块的自由链表内存池,避免malloc碎片和锁竞争,用于高频创建/销毁的小对象场景。
编译期JSON解析器
利用constexpr字符串处理与递归下降解析,在编译期将JSON文本转为结构化类型,用于配置注入。
链式异步编排:fut::then实现
基于std::future与std::promise,实现类似JavaScript Promise的链式then回调,支持异常传递。
固定容量静态向量:boost::static_vector实现
实现一个栈上分配的动态大小但容量固定的连续容器,避免堆分配,适用于嵌入式与实时系统。
std::integer_sequence与类型擦除
利用参数包展开与tuple实现任意类型列表的编译期索引访问,模拟动态语言的数组异质特性。
SFINAE驱动条件式序列化框架
利用SFINAE检测类型是否具有特定成员函数,自动选择序列化路径(JSON/二进制),无需手动注册。
模板模板参数:让模板像函数参数一样传递
深入探讨C++模板参数中嵌套模板的用法,揭示如何通过template template parameters实现更灵活的泛型编程模式,从而构建高度可复用的容器适配器。
SFINAE:通过模板替换失败实现编译期分支
介绍C++中Substitution Failure Is Not An Error原理,展示如何利用enable_if和decltype在编译期选择函数重载,从而编写类型安全的泛型代码。
折叠表达式:变参模板的优雅化简
详解C++17折叠表达式如何简化变参模板的递归展开,支持二元操作符的左折叠与右折叠,实现参数包的高效合并、查找与聚合。
定位new与内存池:自定义对象生命周期管理
超越常规new/delete,探索定位new在预分配缓冲区上构造对象的能力,并基于此设计高效的内存池,避免频繁系统调用。
constexpr if:编译期分支决策消除模板膨胀
讲解C++17的constexpr if语句如何在编译期根据常量表达式选择代码路径,替代SFINAE和标签分发,让泛型代码更直观。
[[likely]]与[[unlikely]]:分支预测提示优化性能
介绍C++20引入的分支预测属性,展示如何向编译器提示哪些分支更可能被执行,从而优化流水线,适合错误处理与热点路径。
原子智能指针:lock-free的无锁数据共享
探讨std::atomic<std::shared_ptr>和std::atomic_ref在并发环境下安全修改共享指针,避免锁竞争并保证内存序正确。
协程生成器:惰性序列与异步流处理
利用C++20协程实现一个生成器(generator)类,演示如何暂停执行并yield值,构建惰性求值的序列,连接异步事件驱动模型。
编译期反射:用模板元编程解析结构体成员
不依赖运行时RTTI,展示如何利用宏和模板技巧在编译期枚举结构体成员名称、类型与偏移,实现序列化与日志的零开销抽象。
并行策略与执行策略:C++17的算法加速器
深入std::execution::par、unseq等执行策略,展示如何零改动地将标准算法转换为并行或向量化版本,并讨论数据竞争与性能陷阱。
值类别与生命周期延长的隐藏规则
深入C++的值类别(lvalue、xvalue、prvalue)与临时对象生命周期的交互,揭示引用绑定与const引用延长临时对象的具体机制。
参数包的正则表达式模式匹配
利用C++17的折叠表达式与编译期字符串操作,实现变长模板参数包的编译期正则风格模式匹配。
原子类型与信号处理器的无锁通信
讲解std::atomic与std::sig_atomic_t的正确用法,在信号处理器与主线程之间安全传递状态。
CRTP模式实现类型安全的单例继承链
用奇异递归模板模式(CRTP)构建可继承的、类型安全的单例基类,解决传统单例的继承问题。
volatile在多线程中的真正作用与误用
澄清volatile不提供原子性或内存序,讲解其正确用途(阻止编译器优化、映射内存映射I/O)与线程安全工具的根本区别。
编译期字符串哈希与查表引擎
编写constexpr函数在编译期计算字符串哈希值,并构建完美的switch-case映射,实现零运行时开销的字符串分派。
嵌套不完整类型与Pimpl惯用法的深度变体
利用前向声明和嵌套类的特性,实现编译期防火墙的极致版本,包含unique_ptr对不完整类型的支持细节。
类专属operator new重载与内存池整合
为特定类重载全局或成员operator new/delete,并接入固定大小的内存池,提升小对象分配性能。
移动迭代器与懒惰变换视图的内部机制
剖析std::move_iterator与std::ranges::transform_view的实现细节,理解移动语义如何与迭代器适配器交互。
深入 new 表达式:自定义分配与释放钩子
本教程讲解 C++ 中 new 表达式底层的分配机制,并演示如何通过替换 operator new 和 operator delete 实现全局或类级别的内存分配钩子,用于监控、记录或限制动态内存使用。
函数参数传递的 ABI 优化:寄存器、堆栈与合成类型
本教程揭示 C++ 函数参数在底层(x86-64 / ARM64)如何通过寄存器与堆栈传递,并讲解如何利用 ABI 规则优化内联、避免不必要的拷贝,以及 synthetic(合成)类型对传递开销的影响。
定位 new 与显式析构:在原始内存中构建与析构对象
本教程讲解 placement new 语法:在已分配的内存上构造对象,以及如何手动调用析构函数。这是实现自定义容器、内存池或对象池的核心技术,也是标准分配器与 polymorphic allocator 的基础。
Lambda 的生命周期陷阱:按引用捕获与悬挂引用
本教程深入分析 lambda 捕获局部变量([&] 或 [&x])时,若 lambda 存活超过被捕获变量的生命期,会产生悬挂引用。介绍如何利用 std::shared_from_this 和复制捕获避免此问题,以及 C++14 泛型 lambda 中的特殊情形。
线程局部存储 (thread_local) 的实现与陷阱
本教程讲解 C++11 引入的 thread_local 关键字,它的底层实现通常依赖 TLS(线程局部存储)或 __thread,并讨论初始化顺序、动态库中的行为、以及性能开销—尤其是跨平台不一致性。
异常展开 (Stack Unwinding) 的代价与禁用优化
本教程解释抛出异常时编译器需要生成展开表(unwind table)和清理代码,导致即使不抛出异常,函数体积与寄存器压力也增加。分析如何通过 noexcept、异常规范以及 /EHs 与 /EHsc 区别来优化,以及何时应避免使用异常。
具名返回值优化 (NRVO) 与未具名返回值优化 (URVO) 的触发条件
本教程区别 NRVO(具名局部变量返回)与 URVO(临时对象返回)的编译器实现条件,包括哪些情况下保证复制消除(C++17),哪些情况仅仅允许但可能失败,以及如何检验是否发生了优化。
std::any 的实现原理:类型擦除与小对象优化
本教程讲解 std::any 如何通过类型擦除(type erasure)存储任意类型,以及小对象优化(SBO)机制:对于小于等于某个大小的类型直接存储在内部缓冲,避免堆分配。还会探讨虚函数 vs 函数指针的取舍。
constexpr if 与 SFINAE 的恩怨:现代编译期分支
本教程介绍 constexpr if (C++17) 如何替代许多传统的 SFINAE(Substitution Failure Is Not An Error)技巧,通过实例对比两者的语法与能力,并解释 constexpr if 不能完全替代 SFINAE 的少数场景(如偏特化、返回类型推导)。
原子操作与信号安全:std::atomic_signal_fence 的正确用法
本教程讲解 C++ 中信号处理器与主线程间的同步机制,介绍 std::atomic_signal_fence(非原子内存栅栏)与 std::atomic_thread_fence 的区别,以及如何利用它安全地在信号处理函数中访问共享标志。