准备 Linux C++ 面试,核心在于熟练掌握 C++ 语言特性、理解 Linux 系统原理、具备扎实的计算机基础(操作系统/网络/数据结构)以及有实际项目经验。
以下是为你整理的详细面试准备指南,分为知识模块、实战准备和面试技巧三个部分。
一、 核心知识模块
1. C++ 语言基础(重中之重)
面试官通常会从基础问到高级,考察深度。
- 内存管理:
- 栈(Stack)与堆(Heap)的区别。
new / delete 与 malloc / free 的区别。
- 内存对齐(Memory Alignment)的原理和作用。
- 智能指针:
shared_ptr, unique_ptr, weak_ptr 的实现原理、循环引用问题。
- 面向对象 (OOP):
- 虚函数表(vtable)和虚函数指针(vptr)的内存布局。
- 构造函数、析构函数、拷贝构造、移动构造、赋值运算符(Rule of Five/Zero)。
- 多态的实现原理(静态多态 vs 动态多态)。
- C++11/14/17/20 新特性:
- 必考:右值引用(Rvalue Reference)、移动语义(Move Semantics)、完美转发(Perfect Forwarding)。
- Lambda 表达式(捕获列表、底层实现)。
auto / decltype。
- 容器:
std::vector 扩容机制、std::unordered_map 底层实现(哈希表冲突解决)。
- 语法细节:
const 与 volatile 的作用。
static 的用法(修饰变量、函数、类成员)。
- 类型转换:
static_cast, dynamic_cast, reinterpret_cast, const_cast 的区别。
2. Linux 系统编程
这是区别于 Windows C++ 开发的关键点。
- 进程与线程:
- 进程间通信(IPC):管道(Pipe)、消息队列、共享内存、信号量、Socket。
- 线程同步:互斥锁(Mutex)、条件变量(Condition Variable)、读写锁、信号量。
- 死锁:产生的四个必要条件,如何避免。
fork() 机制(写时复制 COW)。
- Linux 常用机制:
- IO 模型:阻塞、非阻塞、同步、异步、IO 多路复用(Select, Poll, Epoll 的区别及底层原理)。
- 文件操作:Linux 文件描述符(FD)限制,零拷贝(sendfile, mmap)。
- 异常与信号(Signal)处理。
- 常用命令:
- 排查问题:
top (看CPU), free (看内存), df (看磁盘), netstat / ss (看网络), strace (追踪系统调用), gdb (调试)。
- 性能分析:
perf, valgrind (内存泄漏检测)。
3. 计算机基础
- 数据结构与算法:
- 虽然不是纯算法岗,但排序(快排、归并)、查找(二分)、链表、二叉树、哈希表是必考的。
- STL 源码:
vector, list, map, set 的底层实现。
- 操作系统:
- 虚拟内存、页表、TLB、缺页中断。
- 上下文切换(Context Switch)的开销。
- 计算机网络:
- TCP 三次握手/四次挥手、TCP 状态机、拥塞控制、滑动窗口。
- HTTP/HTTPS 协议。
- UDP 与 TCP 的区别,适用场景。
二、 实战与项目准备
1. 项目经验(这是区分度最高的部分)
面试官非常看重你是否有实际在 Linux 环境下开发的经验。
- 准备 1-2 个核心项目:最好是网络相关的(Web Server、RPC 框架、即时通讯 IM)或者高性能计算相关的。
- STAR 法则:
- Situation:项目背景(解决什么问题)。
- Task:你的职责。
- Action:你做了什么(用了什么技术,解决了什么难点)。
- Result:最终效果(QPS 提升多少,延迟降低多少)。
- 深挖技术细节:
- 如果做了 Web Server,要能讲清楚 Reactor 模型、线程池、缓冲区设计、定时器设计。
- 如果用了多线程,要能讲清楚锁的粒度控制。
2. 手撕代码(Coding)
- 环境:通常是 Linux 环境(牛客网、赛码网或本地 IDE)。
- 要求:
- 熟练使用 STL(string, vector, map, unordered_map, algorithm)。
- 代码要健壮(考虑边界条件、空指针)。
- 时间复杂度和空间复杂度分析。
- 常见题型:
- 字符串处理(反转、匹配)。
- 链表操作(反转、环检测、合并)。
- 二叉树遍历(递归与非递归)。
- 简单的动态规划或回溯。
3. 调试与工具
- GDB:必须会基本的调试命令(
break, run, next, step, print, bt 查看堆栈)。
- Makefile/CMake:知道如何编译链接,理解编译过程(预处理 -> 编译 -> 汇编 -> 链接)。
三、 面试准备时间线建议
第一阶段:查漏补缺(1-2周)
- 复习《C++ Primer》或《Effective C++》中的重点章节。
- 复习《Unix环境高级编程》(APUE)和《Linux高性能服务器编程》(游双著,非常适合面试)。
- 刷 LeetCode 的 C++ 题目(建议 150-200 道,重点在 Medium)。
第二阶段:项目复盘与深度挖掘(1周)
- 整理简历上的项目,画出架构图。
- 准备“难点”和“亮点”的回答。例如:“我在项目中遇到了内存泄漏,我是用 Valgrind 定位并解决的。”
第三阶段:模拟面试(持续进行)
- 找朋友进行模拟面试,或者自己录音练习。
- 针对“为什么选择这个方案而不是那个方案”进行自问自答。
四、 高频面试题速查(示例)
- C++:
shared_ptr 是线程安全的吗?(答:引用计数增减是原子操作,但指向的对象不是,且 shared_ptr 本身的赋值不是线程安全的)。
- Linux:
epoll 的 LT(水平触发)和 ET(边缘触发)模式有什么区别?ET 模式为什么要配合非阻塞 IO?(答:ET 只在状态变化时触发,如果不一次读完,后续可能不再触发,非阻塞防止阻塞在 read 上)。
- OS:
fork() 之后,父子进程的内存是立刻复制的吗?(答:不是,是写时复制 COW)。
- 网络:
TIME_WAIT 状态是什么?为什么需要它?(答:主动关闭方最后等待 2MSL,为了保证最后的 ACK 能到达,以及旧连接的数据包在网络中消失)。
五、 推荐书单
- C++:《C++ Primer》、《Effective C++》、《More Effective C++》、《STL 源码剖析》(侯捷)。
- Linux/系统:《Unix环境高级编程》(APUE)、《Linux高性能服务器编程》(游双)、《深入理解计算机系统》(CSAPP,必读)。
总结:Linux C++ 面试非常看重底层原理。不要只停留在“会用”的层面,要理解“为什么这么用”以及“底层是怎么实现的”。祝你面试顺利!