高频知识点总表¶
这份表不是按公司,而是按跨公司重复出现频率整理。
1. C++ 对象模型 / 虚函数 / 类大小¶
高频问题:
- 类的大小由什么决定?
- 构造函数里能不能调虚函数?
- 虚函数表 / 虚表指针怎么理解?
速答:
- 类大小主要由非静态成员、对齐、继承布局和虚函数相关开销共同决定。
- 构造/析构阶段不要依赖“最派生类虚调用”,因为对象还没完全构造好或已经开始拆解。
详见:
2. 现代 C++:移动语义 / 智能指针 / RAII¶
高频问题:
std::move到底做了什么?unique_ptr/shared_ptr/weak_ptr区别?- 为什么
shared_ptr容易被追问?
速答:
std::move只是显式右值化,本身不搬运资源;真正发生移动的是移动构造/赋值。- 智能指针本质上是在表达所有权,不是“自动管理内存的魔法”。
详见:
3. STL 容器 / 红黑树 / 哈希 / 迭代器失效¶
高频问题:
vector和list怎么选?map和unordered_map怎么选?- 红黑树为什么常用?
- 迭代器什么时候失效?
速答:
- 容器选择不能只看大 O,还要看连续内存、局部性、rehash/扩容和元素搬移成本。
map更偏有序语义和稳定复杂度,unordered_map更偏平均查询效率。
详见:
4. 内存管理 / new-delete / 内存池¶
高频问题:
new/delete和malloc/free区别?- placement new 是什么?
- 内存池为什么能提速?
速答:
malloc/free管字节块,new/delete管对象生命周期。- 内存池的价值不只是更快,还在于降低碎片、减少锁竞争、让分配延迟更稳定。
详见:
5. 线程 / 锁 / 原子 / 线程池¶
高频问题:
mutex和atomic差别?- 条件变量为什么要防虚假唤醒?
- 线程池怎么设计?
速答:
atomic适合单点原子状态,mutex更适合保护复杂共享状态和不变式。- 条件变量一定要配谓词,因为被唤醒不等于条件真的成立。
详见:
6. 进程 / 线程 / IPC / IO 多路复用¶
高频问题:
- 进程和线程区别?
- epoll 为什么高效?
- 进程通信方式有哪些?
速答:
- 进程更强调隔离,线程更强调执行流;线程更轻,但共享带来的同步复杂度更高。
- epoll 的核心优势是把“关注集合”和“就绪事件”分离,减少无效扫描。
详见:
7. TCP / HTTP / TIME_WAIT / DNS¶
高频问题:
- 三次握手 / 四次挥手为什么这样设计?
- TIME_WAIT 为什么存在?
- DNS 解析过程是什么?
- 长连接 / WebSocket / HTTP2 / HTTP3 有什么差别?
速答:
- TCP 的核心是把不可靠网络抽象成尽量可靠有序的字节流,三次握手和 TIME_WAIT 都是协议正确性的成本。
- DNS 本质是分层名字解析系统,强依赖缓存和递归解析。
详见:
8. MySQL / Redis / 缓存一致性¶
高频问题:
- 索引为什么能加速?
- MVCC / 幻读怎么理解?
- Redis 为什么快?
- 缓存一致性怎么做?
速答:
- MySQL 索引的本质是缩小扫描范围,不是“无条件变快”;Redis 快在于内存、执行路径短和数据结构高效。
- 缓存一致性通常不是完全杜绝不一致,而是尽量缩小窗口并提供补偿。
详见:
9. 算法高频:红黑树 / 堆 / TopK / DP / BFS-DFS¶
高频问题:
- 红黑树和 AVL 区别?
- TopK 怎么做?
- 动态规划三步法?
- BFS 和 DFS 场景怎么分?
速答:
- 算法题不只看模板,还要看输入规模、在线/离线、空间限制和常数因子。
- TopK 常见是小顶堆、快速选择、桶;DP 真正难点在状态建模。
详见: