理想汽车 后端开发-C++ 三面
1. 项目拷打
2. vector vs 普通数组
- vector:动态扩容、连续内存、自动管理内存、安全、支持迭代器、自带API
- 普通数组:静态大小、栈/静态分配、手动管理内存、无边界检查
- 日常开发优先 vector,极致性能场景可用数组
3. vector push_back 均摊 O(1)
- 采用指数扩容(1.5倍/2倍)
- 扩容次数极少,所有插入的总拷贝次数为线性级
- 均摊后每次插入效率为 O(1)
4. vector vs list
- vector:连续内存、随机访问快、尾插尾删快、CPU 缓存友好
- list:链表结构、任意位置插入删除快、迭代器不失效、随机访问慢
- 遍历读多用 vector,频繁中间插入用 list
5. 连续内存对 CPU Cache 好处
- 空间局部性极佳,相邻数据会一起加载到缓存
- 缓存命中率大幅提升,减少低速内存访问
- 速度比缓存不命中快 10~100倍,高并发差距极大
6. inline 函数 vs 宏
- inline:C++ 关键字、类型安全、调试友好、无副作用、作用域安全
- 宏:纯文本替换、无类型检查、易出错、调试困难
- 现代 C++ 一律用 inline,弃用宏
7. 长期职业发展规划
8. 为什么选择自动驾驶方向
9. 虚表、虚指针、多态底层内存布局
- 含虚函数的对象,头部会多一个虚指针(vptr)
- 虚指针指向虚表(vtable),虚表是虚函数地址数组
- 多态的本质:运行时通过虚指针查找虚表调用函数
- 多继承:对象含多个虚指针;虚继承:共享基类+偏移表
10. 完美转发 + 引用折叠原理
- 引用折叠:只有 T&& + && 才是右值,其余都是左值
- forward:还原参数左值/右值属性,实现完美转发
11. 移动构造/赋值被编译器删除的4种情况
- 显式定义了拷贝构造或拷贝赋值
- 类中有不可移动的成员变量
- 基类不可移动
- 显式定义了析构函数
12. 野指针、悬空指针、悬空引用区别
- 野指针:未初始化的指针,指向随机地址
- 悬空指针:指向已释放内存的指针
- 悬空引用:绑定到已销毁对象的引用
- 后果:未定义行为、程序崩溃、内存踩踏
13. C++ 无锁编程三大核心难点
- ABA 问题:CAS 无法识别值被改回,需要版本号解决
- 指令重排:编译器/CPU 乱序执行,必须用内存序控制
- 缓存可见性:多核缓存不一致,需 acquire/release 内存屏障
14. 算法题:
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++ 常考面试题总结 文章被收录于专栏
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.