校招 未知部门 / 后端-C++ / 未知轮次

[面试日期] 2026-06-11 [面试时长] 未知
[学校背景] 浙江大学 | 985 [学历背景] 未知
[发布人] 面试之星官方收录
<h2>字节跳动 C++ 面经</h2> <p>字节跳动的 C++ 岗位面经,和其他大厂有一个很明显的共同点:<strong>不太爱考“你会背多少定义”,更爱考“你在项目里怎么用、为什么这么用、换一层场景你还扛不扛得住”。</strong></p><p>我整理这份面经,是因为最近好几份字节 C++ 方向的反馈里,题目形态高度相似——前半段围绕简历项目深挖,后半段集中轰炸 C++ 语言机制、操作系统、并发和网络。有人面的是客户端/基础架构,有人面的是后端服务,但 C++ 这条线的“味道”是统一的:<strong>基础要硬,项目要能讲透,八股不能只会背,得能落到工程判断上。</strong></p><p>字节 C++ 面试通常有几条隐性标准,提前知道会少踩很多坑:</p><p><strong>第一,项目不是“介绍”,是“答辩”。</strong> 面试官会顺着你的线程池、网络模块、内存管理方案一直往下挖:类怎么设计的、边界条件怎么处理、有没有测过并发场景、为什么不用现成的库。简历上写“熟悉 C++11/14/17”,但项目里全是 <code>new/delete</code> 和裸指针,很容易被追问到露馅。</p><p><strong>第二,C++ 问得很“立体”。</strong> 不是单独考 <code>shared_ptr</code> 计数原理,而是连着 RAII、异常安全、移动语义、容器失效场景一起问。语言、OS、网络经常交叉——比如让你设计一个高并发下载器,背后其实在考线程池、锁粒度、断点续传、IO 多路复用,以及 C++ 里怎么组织这些模块。</p><p><strong>第三,手写和口述并重。</strong> 字节不少轮次会有“写结构体算内存对齐”“实现一个简单的智能指针/线程安全队列”“分析一段代码输出”这类题。不一定每次都手撕 LeetCode Hard,但<strong>语言细节 + 系统设计小场景</strong>出现频率很高。</p><p><strong>第四,基础架构岗会更偏底层。</strong> 如果投的是基础架构、中间件、高性能计算方向,除了常规八股,还会多问内存模型、无锁结构、性能优化、编译链接这些。客户端方向则可能更关注 UI 线程模型、跨平台、资源生命周期管理。</p><p>下面这 15 道题,是我从多份字节 C++ 面经里归纳出的高频方向,<strong>题目已全部换新</strong>,按“项目深挖 + 语言/系统八股”两类组织,方便你对照自测。没有附答案——面经的价值在于帮你定位盲区,真正上考场还得靠自己把每条链路讲顺。</p><h3>核心大厂开发面试题以及基础八股文资料汇总:</h3><p><a href="https://gw-c.nowcoder.com/api/sparta/jump/link?link=https%3A%2F%2Fgw-c.nowcoder.com%2Fapi%2Fsparta%2Fjump%2Flink%3Flink%3Dhttps%253A%252F%252Fgw-c.nowcoder.com%252Fapi%252Fsparta%252Fjump%252Flink%253Flink%253Dhttps%25253A%25252F%25252Fgw-c.nowcoder.com%25252Fapi%25252Fsparta%25252Fjump%25252Flink%25253Flink%25253Dhttps%2525253A%2525252F%2525252Fgw-c.nowcoder.com%2525252Fapi%2525252Fsparta%2525252Fjump%2525252Flink%2525253Flink%2525253Dhttps%252525253A%252525252F%252525252Fgw-c.nowcoder.com%252525252Fapi%252525252Fsparta%252525252Fjump%252525252Flink%252525253Flink%252525253Dhttps%25252525253A%25252525252F%25252525252Fgw-c.nowcoder.com%25252525252Fapi%25252525252Fsparta%25252525252Fjump%25252525252Flink%25252525253Flink%25252525253Dhttps%2525252525253A%2525252525252F%2525252525252Fgw-c.nowcoder.com%2525252525252Fapi%2525252525252Fsparta%2525252525252Fjump%2525252525252Flink%2525252525253Flink%2525252525253Dhttps%252525252525253A%252525252525252F%252525252525252Fgw-c.nowcoder.com%252525252525252Fapi%252525252525252Fsparta%252525252525252Fjump%252525252525252Flink%252525252525253Flink%252525252525253Dhttps%25252525252525253A%25252525252525252F%25252525252525252Fgw-c.nowcoder.com%25252525252525252Fapi%25252525252525252Fsparta%25252525252525252Fjump%25252525252525252Flink%25252525252525253Flink%25252525252525253Dhttps%2525252525252525253A%2525252525252525252F%2525252525252525252Fgw-c.nowcoder.com%2525252525252525252Fapi%2525252525252525252Fsparta%2525252525252525252Fjump%2525252525252525252Flink%2525252525252525253Flink%2525252525252525253Dhttps%252525252525252525253A%252525252525252525252F%252525252525252525252Fwww.nowcoder.com%252525252525252525252Fcreation%252525252525252525252Fmanager%252525252525252525252FcolumnDetail%252525252525252525252FMq7XWW">https://www.nowcoder.com/creation/manager/columnDetail/Mq7XWW</a></p><h2>一、自我介绍与项目深挖</h2><blockquote><p>字节前几轮几乎都会从项目和自我介绍切入,C++ 相关岗位尤其爱问“你写的模块里用了哪些语言特性、为什么这么设计”。</p></blockquote><p><strong>1.</strong> 请介绍一下你简历里最有代表性的 C++ 项目,它在业务上解决什么问题?你在其中负责哪几个核心模块?</p><p><strong>2.</strong> 项目里如果用了多线程,任务是怎么拆分的?线程之间如何同步,有没有遇到过死锁或数据竞争,你是怎么定位和修复的?</p><p><strong>3.</strong> 你的项目里有没有自己封装过 C++ 类(比如线程池、连接池、对象池、消息队列)?请说一下核心类的职责划分,以及关键接口的设计思路。</p><p><strong>4.</strong> 项目里 C++ 的资源管理是怎么做的?有没有用 RAII、智能指针或自定义 deleter?如果混用了裸指针,理由是什么?</p><p><strong>5.</strong> 如果让你把现有项目从 C++11 升级到 C++17/20,你会优先改哪些地方?哪些改动风险最大?</p><h2>二、C++ 语言、系统与网络八股</h2><blockquote><p>字节 C++ 面的“八股”往往不是孤立定义题,而是会接一句“结合项目/场景说说”。</p></blockquote><p><strong>6.</strong><code>std::move</code> 和 <code>std::forward</code> 分别解决什么问题?什么情况下会发生“伪移动”,导致性能或逻辑出问题?</p><p><strong>7.</strong><code>shared_ptr</code>、<code>unique_ptr</code>、<code>weak_ptr</code> 的实现原理和使用场景分别是什么?什么情况下 <code>shared_ptr</code> 会导致循环引用,怎么破?</p><p><strong>8.</strong> 虚函数的实现机制是什么?虚表、虚指针在内存里怎么布局?构造函数里调用虚函数为什么通常不是多态行为?</p><p><strong>9.</strong> C++ 内存对齐(alignment)是什么?给定一个包含多种成员的结构体,如何计算它的 <code>sizeof</code>?为什么要 <code>#pragma pack</code> 或 <code>alignas</code>?</p><p><strong>10.</strong> 动态链接和静态链接的区别是什么?程序运行时,动态库里的符号是怎么被解析和加载的?</p><p><strong>11.</strong> 操作系统里虚拟地址和物理地址是什么关系?为什么需要虚拟内存?访问不在物理内存中的页时,系统会发生什么?</p><p><strong>12.</strong> 设计一个支持多线程并发下载、且能断点续传的文件下载器,你会怎么划分模块?C++ 里线程池、任务队列、文件 IO 各自怎么配合?</p><p><strong>13.</strong> TCP 和 UDP 的核心区别是什么?在高并发 C++ 服务端里,你会在什么场景选 TCP,什么场景考虑 UDP 或 QUIC?</p><p><strong>14.</strong> HTTPS 的握手过程大致是怎样的?对称密钥和非对称密钥在流程里各扮演什么角色?为什么不全程用非对称加密传数据?</p><p><strong>15.</strong><code>std::vector</code> 扩容时会发生什么?迭代器/指针/引用在什么操作后会失效?<code>emplace_back</code> 和 <code>push_back</code> 在性能和语义上差在哪?</p><h2>结尾</h2><p>把上面 15 道题过一遍,如果发现自己“项目部分能讲个大概,八股部分有一半要想想”,那状态和大多数第一次面字节 C++ 的同学差不多——<strong>不算差,但还不够稳。</strong></p><p>字节 C++ 面试真正筛的,不是“会不会背 100 道八股”,而是下面这三件事能不能同时成立:</p><p><strong>你能讲清楚自己写过的代码。</strong> 不是复述项目背景,而是能说到类关系、线程模型、异常路径、性能瓶颈、如果重做会改什么。面试官追问三层还不虚,项目分就不会低。</p><p><strong>你能把 C++ 特性翻译成工程决策。</strong> 不是回答“智能指针就是自动释放内存”,而是能说明“这个模块用 <code>unique_ptr</code> 表达独占所有权,跨模块共享才上 <code>shared_ptr</code>,回调里用 <code>weak_ptr</code> 防循环引用”——这种回答才像干过的。</p><p><strong>你能在小场景里做系统设计。</strong> 比如第 12 题的下载器,考的不只是“会不会写线程池”,而是任务调度、持久化断点、失败重试、带宽控制、线程安全边界——字节很吃这一套,因为日常 work 里大量是“用 C++ 搭可靠的高性能模块”,不是刷题。</p><p>复习建议可以按这个顺序来:</p><ol><li><strong>先过项目</strong>:每个 C++ 模块准备 3 分钟版本 + 10 分钟深挖版本,重点准备并发、内存、网络三块。</li><li><strong>再补语言死角</strong>:移动语义、智能指针、虚函数、容器失效、内存对齐——这五类是字节 C++ 面最高频的语言题。</li><li><strong>然后串 OS 和网络</strong>:虚拟内存、链接加载、TCP/HTTPS——不需要背 RFC,但要能画流程、讲 trade-off。</li><li><strong>最后做小场景口述</strong>:下载器、日志系统、定时器、限流器——用 C++ 的类设计把方案讲出来,比单纯背概念有用得多。</li></ol><p>最后说一句:字节 C++ 面经看起来题型散,其实内核很集中——<strong>语言功底 + 工程表达 + 场景设计</strong>。15 道题覆盖不了全部,但如果每道题你都能用自己的话讲 1~2 分钟,上场时至少不会“题都见过,一追问就卡壳”。</p><p></p>
AI 推荐面试题