跳转至

字节跳动 C++ 面经真题整理

参考来源

高频真题

1. 声明和定义有什么区别?

速答: 声明告诉编译器“这个名字存在”,定义才真正分配实体或给出完整实现;模板、内联和 ODR 追问常从这里展开。
细看: STL、模板、编译链接、const/static/inline

2. C++ 中类的大小由什么决定?

速答: 主要取决于非静态成员、对齐、基类子对象和虚函数相关布局;答这题最好顺带补静态成员不计对象大小。
细看: 对象模型、内存布局、类与多态

3. 四次挥手里,第三个包收到后客户端进入什么状态?

速答: 如果按标准关闭流程看,主动关闭的一侧在发出最后 ACK 后通常进入 TIME_WAIT;这题本质在考连接状态机。
细看: TCP、UDP、HTTP、HTTPS

4. 第一个 FIN 的 ACK 没收到会怎么办?重复 FIN/ACK 怎么处理?

速答: TCP 会按超时重传和状态机规则处理,核心是靠序列号、ACK 和超时机制保证可靠关闭,而不是“一次挥手就结束”。
细看: 网络进阶:重传、拥塞控制、长连接、WebSocket

5. TIME_WAIT 和 CLOSE_WAIT 分别说明了什么?

速答: TIME_WAIT 更偏主动关闭方为保证最后 ACK 和旧报文隔离付出的成本,CLOSE_WAIT 常说明被动关闭方还没真正 close 掉连接。
细看: TCP、UDP、HTTP、HTTPS

6. 为什么无权最短路一般用 BFS?

速答: 因为 BFS 按层扩展,第一次到达目标节点时通常就是边数最少的路径;这类题和状态机/图搜索很容易一起出现。
细看: 数据结构与算法面试基础

7. 第三个包收到后为什么不是立刻就“完全结束”了?

速答: 因为关闭连接不只是发包顺序问题,还要考虑双方状态是否一致、最后 ACK 是否可靠送达以及旧报文隔离。
细看: TCP、UDP、HTTP、HTTPS

8. 为什么 TIME_WAIT 不能简单看成“浪费资源”?

速答: 因为它承担了最后 ACK 可靠送达和旧报文隔离的职责,是协议正确性成本,不只是坏状态。
细看: TCP、UDP、HTTP、HTTPS

9. 图搜索题为什么很容易和网络状态机题放在一起?

速答: 因为两类题都在考“状态定义 + 转移边界 + 异常路径”,只是一个在算法图上,一个在协议状态机上。
细看: 数据结构与算法面试基础

10. 如果让你手撕一题,最容易丢分的地方是什么?

速答: 通常不是主流程,而是边界条件、状态回退、退出协议和复杂度说明;字节很喜欢看你是不是边写边讲清楚。
细看: 手撕题与实现专题导航

11. 为什么字节喜欢把协议题和算法题混着问?

速答: 因为两类题都在考抽象状态、边界和异常路径,只是一个偏系统语义,一个偏数据结构语义。
细看: 项目面试题:性能优化、线上排障、系统思维

12. 如果让你先口头分析一道题,你该先说什么?

速答: 先说输入规模、状态定义、复杂度目标和边界,再动手写;字节这类场景很看“先建模后实现”。
细看: 数据结构与算法面试基础

13. 为什么很多协议题最后都会追到“异常路径”而不是正常流程?

速答: 因为正常流程谁都能背,真正拉开差距的是超时、重传、重复包、半开连接和状态不一致这些边界条件。
细看: 网络进阶:重传、拥塞控制、长连接、WebSocket

14. 如果面试官让你手写 BFS / DFS,你先提醒自己什么?

速答: 先确认 visited 管理、边界条件、队列/递归深度和复杂度,再写主流程;字节很看这种“先立规矩再动手”的习惯。
细看: 数据结构与算法面试基础

15. 如果让你解释一个协议流程,为什么要主动画状态图或口述状态迁移?

速答: 因为这能把复杂流程压缩成“状态 + 事件 + 转移”,比零散背步骤更能体现理解深度。
细看: TCP、UDP、HTTP、HTTPS

16. 如果题里顺手加一道算法 / 手撕怎么办?

速答: 字节公开面经里很常把协议、状态机和手撕题混着问,所以回答要先讲状态,再讲边界,再讲复杂度。
细看: 数据结构与算法面试基础 / 手撕题与实现专题导航

答题提示

  • 字节很适合用“状态定义 → 转移条件 → 边界情况 → 复杂度”这个顺序回答。
  • 如果是协议题,主动补超时、重传、重复包、异常状态,会明显更像做过系统题的人。
  • 如果是算法题,先说数据规模和复杂度目标,再写代码,比直接开写稳得多。

这一类面经的字节风格

公开面经里,字节常见特点是:

  • 一面就会把基础、状态机、手撕题揉在一起
  • TCP 关闭流程、状态切换、协议边界特别爱追
  • 很在意你是不是能把问题讲成“状态 + 边界 + 异常路径”