猛犸 C++软件开发 一面 面经
1. 请做一个简单的自我介绍
面试官好,我叫 [姓名],本科/硕士毕业于 [学校],专业是 [专业]。
目前有 [X] 年的 C++ 开发经验,主要方向是 [嵌入式/后台/图像处理等]。在校期间和工作中主要做了 [简述核心项目方向],对网络编程、多线程并发、内存管理这块有比较深入的实践。
平时也会持续学习,最近在研究 [某个技术方向],希望能在贵公司的 [岗位方向] 上进一步成长,以上是我的简单介绍。
2. 说说你做过的最有挑战性的项目,遇到了什么难点,怎么解决的?
- 先介绍项目背景:项目是做什么的,自己负责哪个模块
- 说清楚难点:比如高并发下的性能瓶颈、内存泄漏排查、实时性要求严格等
- 说解决思路:用了什么技术手段,为什么选这个方案而不是其他方案
- 说结果:优化后的指标对比,比如延迟从 Xms 降到 Yms,吞吐量提升了多少
这类题目考察的是解决问题的思路和深度,不要只说"我做了什么",要说"我为什么这么做"。
3. 讲一下 IO 模型有哪些,各自的特点是什么?
- 阻塞 IO:调用 read/write 后线程挂起,直到数据就绪才返回,简单但线程利用率低
- 非阻塞 IO:调用立即返回,数据未就绪返回 EAGAIN,需要轮询,CPU 占用高
- IO 多路复用:用 select/poll/epoll 同时监听多个 fd,有 fd 就绪时再去读写,一个线程可处理大量连接
- 信号驱动 IO:内核数据就绪时发送 SIGIO 信号通知进程,异步通知但信号处理复杂
- 异步 IO(AIO):发起 IO 后立即返回,内核完成数据拷贝后再通知,真正的异步,Linux 上支持不完善,Windows 的 IOCP 是典型实现
实际工程中用得最多的是 IO 多路复用,尤其是 epoll,配合非阻塞 IO 是高并发服务器的标准做法。
4. select、poll、epoll 的区别是什么?
- select:每次调用需将全部 fd 集合从用户态拷贝到内核态,返回后需遍历所有 fd 找就绪的,fd 数量上限 1024,时间复杂度 O(n)
- poll:解决了 fd 数量限制,用链表存储,但仍需全量拷贝和遍历,本质和 select 一样,时间复杂度 O(n)
- epoll:用红黑树管理注册的 fd,就绪链表存放活跃事件,每次只返回就绪的 fd,无需遍历全部,时间复杂度接近 O(1),无 fd 数量限制
- epoll 支持 LT(水平触发)和 ET(边缘触发)两种模式,ET 性能更高但需配合非阻塞 IO 一次性读完数据
- 连接数少时三者差距不大,连接数上万后 epoll 优势明显
5. 线程池的设计思路是什么?核心组件有哪些?
线程池的目的是复用线程,避免频繁创建销毁线程的开
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。
