影石 C++ 一面面经
影石(Insta360)的 C++ 岗位近几年热度不低,一面普遍围绕语言基础、内存与对象模型、现代 C++、RAII、设计模式、STL 底层展开,题量不大,但单题可追问较深,和「只会写业务、说不清原理」的候选人区分度比较明显。
C++ 基础与面向对象
- 空类 class Empty {} 在主流编译器下 sizeof 是多少?为什么要占这么多字节?
- 成员函数、静态成员函数、虚函数在内存里分别存在哪里?调用方式有什么不同?
- 构造函数可以是虚函数吗?析构函数为什么常常要声明成虚函数?
- 菱形继承下数据成员和虚函数表是怎么布局的?虚继承解决了什么问题?
现代 C++(C++11 及以后)
- 左值、右值、将亡值(xvalue)分别是什么?int&& 和 const int& 绑定右值时行为有何差异?
- std::move 和 std::forward 本质上做了什么?为什么说它们通常不搬数据本身?
- 完美转发(perfect forwarding)典型用在哪些场景?写错引用折叠会出现什么问题?
- = default、= delete、explicit 各自解决什么工程问题?各举一个例子。
内存、异常与资源管理
- RAII 的核心思想是什么?和「手动 new/delete」相比,在异常安全上强在哪里?
- 三种异常安全保证(basic / strong / nothrow)分别是什么意思?vector::push_back 应尽量满足哪一种?
- unique_ptr 和 shared_ptr 底层实现差异是什么?shared_ptr 循环引用怎么破?
类型转换与设计模式
- static_cast、reinterpret_cast、const_cast 的使用边界分别是什么?各举一个合理/不合理的例子。
- 手写一个线程安全的单例,至少说出两种写法,并比较懒汉/饿汉的优缺点。
- 策略模式、模板方法模式、观察者模式各适合什么场景?你在项目里用过哪一种?
STL 与容器底层
- std::vector 的 reserve 和 resize 区别是什么?扩容时迭代器为什么会失效?小对象优化(SSO)对 vector<string> 有什么影响?
核心大厂开发面试题以及基础八股文资料汇总:
https://www.nowcoder.com/creation/manager/columnDetail/Mq7XWW
准备方法与策略
1. 按模块刷,不要只背答案
影石一面题目之间有内在联系:虚函数 → 多态 → 析构 → 智能指针 → RAII → 异常安全,是一条线。建议按「OOP 内存模型 → 现代 C++ → STL → 设计模式」四个块准备,每块能画图 + 讲清楚 + 举项目例子。
2. 现代 C++ 是重点,但要能落到工程
move/forward、智能指针、= delete 这类题,面试官常追问:你在代码里怎么用的?有没有踩过坑? 准备 1~2 个真实场景(资源封装、回调传参、容器传大对象)比背标准答案更有用。
3. STL 别只会用,要懂「为什么这样设计」
vector 扩容、allocator、string SSO 是高频方向。重点搞懂:扩容代价、迭代器失效规则、移动语义在扩容里的作用,能口述 push_back 触发扩容时发生了什么。
4. 设计模式别堆名词
影石偏硬件 + 软件结合,更在意场景匹配:单例怎么保证线程安全、观察者怎么处理订阅/退订、工厂怎么解耦创建逻辑。每准备一个模式,配一句「如果不用它会怎样」。
5. 一面节奏建议
- 先给结论,再补 1~2 句原理,面试官感兴趣会深挖
- 不会的题直接说边界,别硬编——一面更看重思路和诚实度
- 留 5 分钟反问:团队技术栈、C++ 标准版本、业务里性能/并发挑战等,显得有准备
6. 推荐复习清单(精简版)
内存布局 | 对象模型、虚表、继承布局 |
C++11/14/17 | 右值引用、移动语义、智能指针、 |
异常与 RAII | 异常安全等级、析构顺序、资源泄漏 |
设计模式 | 单例、观察者、工厂、策略(能讲场景) |
STL |
|
结尾
影石 C++ 一面整体难度中等偏上,题量不大但每道都能往下挖三层。我最大的感受是:光会写业务代码不够,得把「为什么这样写更安全、更高效」讲清楚。
查看21道真题和解析
