01
移动语义的起源
为什么需要移动语义?从C++98的左值右值讲起,分析深拷贝的性能瓶颈。
左值/右值深拷贝
02
左值与右值
左值、右值、纯右值、将亡值的定义与区分,如何通过地址判断。
值类别将亡值
03
右值引用
T&& 的语法,右值引用只能绑定到右值,延长临时对象生命周期。
T&&生命周期
04
移动构造函数
定义与实现,从源对象“偷”资源,避免深拷贝。
资源转移noexcept
05
移动赋值运算符
定义与实现,处理自赋值和资源释放。
自赋值operator=
06
std::move
原理(只是static_cast),使用场景,常见误区(不要对const对象使用)。
static_castconst
07
移动语义与异常安全
noexcept 的重要性,std::vector 的移动优化策略。
noexceptvector
08
默认移动操作
编译器何时自动生成移动构造/赋值,Rule of Five。
Rule of Five自动生成
09
完美转发的动机
泛型编程中如何保持参数的值类别(左值/右值)。
泛型值类别
10
引用折叠
T& & -> T&, T&& & -> T&, T& && -> T&, T&& && -> T&& 的规则。
折叠规则模板
11
万能引用
T&& 在模板中的特殊含义,与右值引用的区别。
万能引用模板推导
12
std::forward
条件转换,仅在参数是右值时转为右值引用。
条件转换完美转发
13
完美转发实现
模板函数 + std::forward 的标准写法。
模板forward
14
可变参数模板与完美转发
实现任意参数个数的转发。
可变参数参数包
15
工厂函数中的完美转发
make_unique, make_shared 的内部实现。
工厂make_unique
16
委托构造函数与完美转发
构造函数之间转发参数。
委托构造初始化
17
移动语义在标准库中的应用
std::vector::push_back 与 emplace_back 的区别。
emplace_backvector
18
移动语义在智能指针中的应用
unique_ptr 的移动语义,shared_ptr 的移动优化。
unique_ptrshared_ptr
19
移动语义在字符串中的应用
std::string 的移动构造,COW 与 SSO 的变迁。
stringSSO
20
移动语义在容器中的应用
std::vector 扩容时的移动优化,std::list 的移动。
扩容list
21
移动语义与返回值优化
RVO, NRVO 与移动语义的协作关系。
RVONRVO
22
移动语义与异常
移动操作抛出异常时的回退机制。
异常安全回退
23
移动语义与多线程
移动资源到线程,避免数据竞争。
线程数据竞争
24
完美转发与lambda表达式
捕获列表中的完美转发。
lambda捕获
25
完美转发与函数重载
解决重载决议中的歧义。
重载歧义
26
移动语义与Pimpl惯用法
通过移动实现高效的对象封装。
Pimpl封装
27
移动语义与类型擦除
std::function 的移动构造。
类型擦除function
28
常见陷阱
移动后状态、自移动、const对象移动、多次移动。
陷阱移动后
29
性能测试
对比拷贝与移动的性能差异,benchmark 分析方法。
benchmark性能
30
综合案例
实现一个支持移动语义和完美转发的自定义容器。
自定义容器实战