面灵AI→

同为股份 C++ 开发面试

轮次
技术面
时间
2026-10
来源
牛客网

《面试题目》

  1. 请做一下自我介绍。
  2. RAG 知识库项目用来解决什么问题?
  3. Linux 进程已经 free/delete 了大量对象,为什么 RSS 可能不下降?
  4. 互斥锁、读写锁、自旋锁有什么区别和使用场景?
  5. C++ 对象在内存里的布局是什么?为什么 sizeof 空类不是 0?
  6. RSS 和 VSS 分别是什么意思?
  7. Linux 缺页异常是什么?malloc 1GB 为什么物理内存可能几乎不增加?
  8. 为什么需要线程池,而不是每次直接创建线程?
  9. 线程池任务队列越大越安全吗?无限队列有什么风险?
  10. static 关键字有什么作用?
  11. 两个 cpp 文件中的全局静态对象互相依赖,为什么可能偶发崩溃?
  12. 虚拟内存和物理内存有什么区别?

《参考解析》

RSS 不下降不等于内存泄漏。free/delete 通常只把内存还给用户态分配器,glibc malloc、jemalloc、tcmalloc 会把空闲块留在 arena、bin 或 thread cache 中,操作系统看到的仍是进程占用的页。判断时要区分真实泄漏、分配器缓存和碎片:看 heap profile 的 allocated bytes 是否持续上涨,再结合 smaps、PSS 和分配器指标。

锁的选择取决于临界区长度、读写比例和竞争程度。互斥锁适合通用临界区,读写锁适合读多写少且读临界区不极短,自旋锁适合极短且持锁线程很快能运行的情况。自旋锁下做数据库查询会白白烧 CPU。

C++ 对象布局受成员顺序、对齐和 padding 影响,空类至少占 1 字节以保证不同对象有不同地址。含虚函数的对象通常有 vptr,多继承和虚继承会更复杂。malloc 只分配虚拟地址空间,首次访问页面才触发缺页并建立物理映射,所以 malloc 1GB 后 RSS 可能几乎不变,memset 后才会明显上涨。