C++ 大厂面经分享
一、整体面试结构
大厂 C++ 岗位(尤其是系统方向 / 基础架构 / 客户端 / 中间件)面试通常分为三块:
- 语言基础(C++核心机制)
- 计算机基础(操作系统 / 计算机网络 / 数据结构)
- 工程能力(项目 + 设计 + 性能优化)
其中,C++本身的深度是区分普通开发者和高水平工程师的关键。
二、C++ 高频考点总览
1. 对象模型(核心中的核心)
必须理解到“实现层级”:
- 对象内存布局
- 虚函数表(vtable)
- 多继承、虚继承内存结构
- this 指针本质
典型考法:
一个类有虚函数时,内存结构如何?多继承情况下,vptr 有几个?
关键点:
- 每个含虚函数的类有 vptr
- 多继承 → 多个 vptr
- 虚继承 → 引入虚基表(vbtable)
C++面试常考题目类型都放入了专栏了:https://www.nowcoder.com/creation/manager/columnDetail/Mq7XWW
2. 指针 & 引用本质
常考但容易被问深:
问题示例:
- 指针和引用的区别?
- 为什么引用不能绑定到临时对象(C++11之前)?
- 右值引用解决了什么问题?
关键理解:
- 引用本质是“受限指针”(编译器层面实现)
- 右值引用用于:移动语义完美转发
3. 内存管理(必问)
常考问题:
- new / malloc 区别
- delete / delete[] 区别
- 内存泄漏如何排查
- 智能指针原理
必须掌握:
std::unique_ptr std::shared_ptr std::weak_ptr
深度问题:
- shared_ptr 为什么是线程安全的?
- weak_ptr 解决什么问题?
核心点:
- shared_ptr:引用计数(原子操作)
- weak_ptr:解决循环引用
4. 拷贝控制(五法则)
面试必问:
- 拷贝构造函数什么时候调用?
- 移动构造函数触发条件?
- 什么是浅拷贝 / 深拷贝?
五法则:
析构函数 拷贝构造 拷贝赋值 移动构造 移动赋值
高频陷阱:
std::vector push_back 时发生了什么?
考点:
- 扩容
- 移动 or 拷贝
- 异常安全
5. STL 底层实现(重点)
必考容器:
- vector
- map
- unordered_map
- list
高频问题:
vector:
- 扩容机制(通常 1.5x / 2x)
- 为什么连续内存?
map:
- 红黑树实现
- 为什么查找是 O(logN)
unordered_map:
- 哈希表
- 冲突解决(拉链法 / 开放地址法)
6. 模板与泛型编程(高阶)
常考:
- 模板实例化过程
- 模板特化 / 偏特化
- SFINAE
进阶:
- 完美转发
std::forward<T>(arg)
考察点:
- 左值 / 右值保持
- 万能引用
7. 多线程(大厂高频)
基础:
- 线程创建
- mutex / lock_guard
- condition_variable
深度问题:
- 死锁产生条件
- 如何避免死锁?
- CAS 是什么?
必须理解:
std::atomic
三、经典高频面试题(带解析方向)
1. vector 和 list 区别?
关键点:
内存 | 连续 | 非连续 |
查找 | 快(缓存友好) | 慢 |
插入 | 慢(搬移) | 快 |
面试官真正想问:
→ 缓存局部性(cache locality)
2. shared_ptr 为什么线程安全?
答:
- 引用计数使用原子操作(atomic)
- 但:对象本身不保证线程安全
3. 什么是右值引用?
核心一句话:
右值引用用于绑定“将要被销毁的对象”,从而触发资源转移而不是拷贝。
4. new/delete 和 malloc/free 区别?
关键点:
- new 会调用构造函数
- malloc 不会
- new 类型安全
- malloc 返回 void*
5. 虚函数是如何实现的?
必须说到:
- vtable(虚函数表)
- vptr(虚指针)
- 运行时多态
6. 什么情况下会发生内存泄漏?
典型:
- new 后未 delete
- 循环引用(shared_ptr)
- 容器持有指针未释放
7. map 和 unordered_map 区别?
核心:
结构 | 红黑树 | 哈希表 |
复杂度 | O(logN) | O(1)(平均) |
有序性 | 有序 | 无序 |
8. 线程安全的单例怎么写?
经典写法:
class Singleton {
public:
static Singleton& instance() {
static Singleton instance;
return instance;
}
private:
Singleton() {}
};
考点:
- C++11 静态局部变量线程安全
9. 什么是内存对齐?
考察:
- padding
- cache line
- 提升访问效率
10. 什么是 RAII?
核心思想:
资源获取即初始化,生命周期绑定对象
典型:
std::lock_guard<std::mutex>
四、大厂真实加分项
1. 能讲清“底层原理”
不是会用,而是:
- vector 为什么快
- map 为什么是红黑树
- shared_ptr 为什么安全
2. 项目要有“工程深度”
面试官重点看:
- 是否做过性能优化
- 是否处理过并发问题
- 是否有架构设计经验
3. 能手撕代码(但不是算法岗)
常见:
- LRU Cache
- 简易线程池
- 实现 shared_ptr(简化版)
五、总结
C++ 面试的本质:
不是考语法,而是考你对“语言背后机制”的理解深度。
如果只停留在:
- 会用 STL
- 会写业务代码
基本很难过大厂。
但如果你能做到:
- 理解对象模型
- 掌握内存与并发
- 能讲清 STL 原理
那么通过率会明显提升。