第一阶段(移动语义):
左值/右值 → std::move 是 cast 不是 move
→ 右值引用变量本身是左值(面试陷阱)
→ 完美转发 std::forward 保持值类别
第二阶段(容器内存布局):
vector:连续 → 缓存友好 → 扩容因子 1.5/2 → 迭代器失效
list:节点散落 → 缓存灾难 → 除非频繁中间插入否则别用
deque:中控+分块 → 两端 O(1) → stack/queue 默认容器
unordered_map:桶+链表 → O(1)均摊 → rehash 是灾难
map:红黑树 → O(log N) → 节点散落同样缓存不友好
第三阶段(智能指针):
unique_ptr:零开销,就是裸指针
shared_ptr:16字节,控制块+原子引用计数,make_shared合并分配
weak_ptr:lock()做原子检查+增加,破循环引用
第四阶段(模板元编程):
模板特化:全特化/偏特化(函数不能偏特化)
Type Traits:编译期布尔值,通过模板偏特化实现
SFINAE:替换失败不是错误,enable_if 条件启用
if constexpr:编译期分支,不匹配分支不编译
constexpr/consteval:编译期计算
Concepts C++20:约束模板参数,报错清晰