面灵AI→

C++ 社招怎么准备:三轮复习法与三层深度自测

时间
2026-10
来源
牛客网

《面试题目》

项目自述四问(每个项目都要能当场答完)

  1. 这个项目解决了什么问题?
  2. 你负责的是哪一块?
  3. 最难的那个技术决策是什么?
  4. 如果重来,你会改哪里?

智能指针(第一层 / 第二层 / 第三层)

  1. shared_ptr、unique_ptr、weak_ptr 各自解决什么问题?
  2. shared_ptr 的引用计数存在哪?循环引用为什么破不掉?
  3. weak_ptr 的原理是什么?引用计数本身是线程安全的吗?

多态(第一层 / 第二层 / 第三层)

  1. 虚函数是怎么实现的?
  2. 虚函数表在内存里放在哪?多重继承下有几张表?
  3. 构造函数里调用虚函数会发生什么?为什么?

线程(第一层 / 第二层 / 第三层)

  1. 进程和线程的区别是什么?
  2. 为什么线程是 CPU 调度的基本单位、进程是资源分配的基本单位?
  3. 线程切换为什么更快?协程为什么不归内核管?

《参考解析》

第一轮:先把「会的」变成「讲得清的」。 这位作者前两周基本浪费在背八股上,第三周换了方法后状态明显不同,核心动作只有一个——把简历上的项目重新过一遍,每个项目逼自己用四句话讲完:解决了什么问题、我负责的是哪一块(不是「参与了」)、最难的那个技术决策是什么、如果重来做哪里不一样。然后读出声计时,超过两分钟就砍。做完这一轮才会意识到:面试官八成的追问是从简历里长出来的,不是从题库里来的;简历写不清楚,背再多题也接不住追问。这一条对社招尤其成立,因为社招面试更快进入项目深挖,面试官判断的是「这个人真的做过什么」,而不是「他知道多少名词」。

第二轮:按「被追问的深度」复习,而不是按知识点列表。 方法是给每个知识点要求答到第三层,答不到就标红——标红意味着你只是知道这个名字。以智能指针为例:第一层是三种指针各自解决什么问题(unique_ptr 独占所有权、shared_ptr 共享所有权并引用计数、weak_ptr 只观察不持有用于破环);第二层是引用计数存在控制块里,与控制块同生共死,两个对象互相持有强引用会让计数永远不归零,所以循环引用破不掉;第三层是 weak_ptr 通过弱计数与 lock() 原子升级来保证不悬空,以及「计数原子不等于对象线程安全」——多个线程同时读同一个 shared_ptr 对象本身(拷贝/赋值同一实例)仍需要同步,因为指针与控制块指针的读写不是单个原子操作。能答到第三层,面试官基本不会再往下挖,因为他已经拿到了想要的信号:你不仅用过,还知道边界。

多态的三层答法。 第一层:虚函数通过虚函数表实现动态绑定,基类指针调用时按对象真实类型找到实现。第二层:编译器为每个含虚函数的类生成一张 vtable(通常放在只读数据段),对象里存一个 vptr 指向它;单继承一张表,多继承通常每个有虚函数的基类子对象各一个 vptr、各一张表,所以指针在基类之间转换时需要偏移调整,这也是多继承下 dynamic_cast 与函数调用开销的来源。第三层:构造函数执行期间对象的动态类型还不完整(基类构造先跑、vptr 先指向基类表),此时调用虚函数得到的是基类版本——这不是编译器缺陷而是语言语义,同理析构函数执行期间也会退化。顺着这条线还能带出「基类析构必须是虚函数」和「构造/析构里不要调虚函数、不要调用可能被重写的钩子」,这三问通常是一起来的。

线程的三层答法。 第一层:进程是资源分配单位、线程是调度单位,线程共享地址空间、进程之间隔离。第二层:因为地址空间与文件描述符等资源属于进程,而执行流(寄存器上下文、栈)可以由多个线程共享同一份资源,所以内核调度的对象是线程;线程私有的是栈、寄存器和 TLS。第三层:线程切换比进程切换快,主要因为不换页表、不刷 TLB(同一地址空间),只换寄存器与栈指针;协程不归内核管是因为它由用户态运行库自己保存与恢复上下文,切换不进内核、没有系统调用与调度器开销,代价是阻塞式系统调用会卡住整个调度线程、也无法利用多核,所以协程适合 IO 密集且能保证「不阻塞」的场景,CPU 密集还要靠线程池。被追到「那线程切换的开销具体花在哪」时,能说出内核栈切换、调度器决策、缓存与 TLB 局部性损失,就算过关。

第三轮:被追问与手写。 作者做对的两件事:找同行朋友模拟面试,唯一要求是一直追问到答不出来为止(体感与自背完全不同);手写三类代码——字符串与链表基础、一个线程安全的队列、一个对象池或内存池,并且边写边说思路,因为面试官看的是思考过程不是最后那几行。两个一开始做错的地方也很有代表性:一是背了但不理解,一追问就露馅,改成「每背一个点,先问自己一句为什么」;二是项目只讲用了什么,而真正拉开差距的是「为什么不用别的」——能讲清 trade-off 的人,比列十个技术名词的人值钱得多。面试前一天他会做三件事:把简历打印出来对着每个项目再讲一遍、准备两个要问对方的问题(团队技术栈、代码 review 怎么做)、睡够(他有一场状态很差就是前一晚刷面经刷到两点)。这三件小事看起来与知识点无关,但它们决定的是你能否把已经会的东西稳定输出。