跳转至

高频知识点总表

这份表不是按公司,而是按跨公司重复出现频率整理。


1. C++ 对象模型 / 虚函数 / 类大小

高频问题:

  • 类的大小由什么决定?
  • 构造函数里能不能调虚函数?
  • 虚函数表 / 虚表指针怎么理解?

速答:

  • 类大小主要由非静态成员、对齐、继承布局和虚函数相关开销共同决定。
  • 构造/析构阶段不要依赖“最派生类虚调用”,因为对象还没完全构造好或已经开始拆解。

详见:


2. 现代 C++:移动语义 / 智能指针 / RAII

高频问题:

  • std::move 到底做了什么?
  • unique_ptr / shared_ptr / weak_ptr 区别?
  • 为什么 shared_ptr 容易被追问?

速答:

  • std::move 只是显式右值化,本身不搬运资源;真正发生移动的是移动构造/赋值。
  • 智能指针本质上是在表达所有权,不是“自动管理内存的魔法”。

详见:


3. STL 容器 / 红黑树 / 哈希 / 迭代器失效

高频问题:

  • vectorlist 怎么选?
  • mapunordered_map 怎么选?
  • 红黑树为什么常用?
  • 迭代器什么时候失效?

速答:

  • 容器选择不能只看大 O,还要看连续内存、局部性、rehash/扩容和元素搬移成本。
  • map 更偏有序语义和稳定复杂度,unordered_map 更偏平均查询效率。

详见:


4. 内存管理 / new-delete / 内存池

高频问题:

  • new/deletemalloc/free 区别?
  • placement new 是什么?
  • 内存池为什么能提速?

速答:

  • malloc/free 管字节块,new/delete 管对象生命周期。
  • 内存池的价值不只是更快,还在于降低碎片、减少锁竞争、让分配延迟更稳定。

详见:


5. 线程 / 锁 / 原子 / 线程池

高频问题:

  • mutexatomic 差别?
  • 条件变量为什么要防虚假唤醒?
  • 线程池怎么设计?

速答:

  • 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 真正难点在状态建模。

详见: