大疆 | C++开发工程师 一面 面经 拷打
1. C++对象模型中,虚函数表(vtable)的布局是怎样的?多继承时vtable如何组织?
答:每个含有虚函数的类都有一张vtable,存放在只读数据段,表中按声明顺序存放虚函数指针。每个该类的对象头部有一个隐藏的vptr指向这张表。
多继承时情况更复杂:对象内存中会有多个vptr,每个基类子对象对应一个。比如类C继承自A和B,C的对象布局是先放A的子对象(含A的vptr),再放B的子对象(含B的vptr)。C重写的虚函数会覆盖A那张表里对应的槽位,同时B那张表里也会有一个thunk(调整器),负责在调用时修正this指针偏移,再跳转到C的实现。这就是为什么多继承下虚函数调用有额外的this指针调整开销。
追问方向:菱形继承时vtable怎么处理 → 引出虚继承、虚基类表(vbtable)的概念。
2. std::move和std::forward的本质区别是什么?什么情况下用错会导致性能问题?
答:std::move本质是一个无条件的static_cast,把任何值转成右值引用,告诉编译器"这个对象可以被移动",它不做任何运行时操作。std::forward是有条件转发,只在模板推导出右值引用时才转成右值,否则保持左值,用于完美转发场景。
用错的典型场景:在转发函数里用std::move而不是std::forward,会把传进来的左值也强转成右值,导致调用方的对象被意外移走(资源被窃取),之后调用方再访问该对象就是未定义行为。另一个常见错误是对具名右值引用参数直接使用,具名的右值引用本身是左值,不加std::move就传给下一层,会退化成拷贝而不是移动,白白损失性能。
3. 内存序(memory order)有哪几种?在无锁编程中,relaxed和acquire/release分别适合什么场景?
答:C++11定义了六种内存序:relaxed、consume、acquire、release、acq_rel、seq_cst。
relaxed只保证原子性,不提供任何同步或顺序约束,适合纯计数器场景,比如统计请求次数,只关心最终值正确,不关心和其他变量的顺序关系,性能最好。
acquire/release是配对使用的:release写操作保证该操作之前的所有写不会被重排到它之后;acquire读操作保证该操作之后的所有读不会被重排到它之前。两者配合可以建立happens-before关系,是实现无锁队列、自旋锁的标准手段,性能比seq_cst好,因为在x86上release/acquire几乎是免费的(x86内存模型本身就是TSO),但在ARM上会生成真实的内存屏障指令。
seq_cst是最强的,保证全局顺序一致,代价最高,只在确实需要多个线程观察到相同操作顺序时才用。
4. RAII机制的核心思想是什么?在异常安全编程中它解决了什么根本问题?
答:RAII的核心是把资源的生命周期绑定到对象的生命周期,构造时获取资源,析构时释放资源。由于C++保证局部对象在离开作用域时(无论正常返回还是异常抛出)一定会调用析构函数,所以资源释放是有保证的。
它解决的根本问题是:在有异常的代码路径中,手动管理资源极易出现泄漏。比如一个函数申请了锁、内存、文件句柄,中间某步抛异常,后面的手动释放代码就不会执行。用RAII封装后,不管哪条路径退出,析构都会被调用,资源一定被释放。
异常安全有三个级别:基本保证(不泄漏资源)、强保证(操作要么完全成功要么完全回滚)、不抛出保证(noexcept)。RAII是实现基本保证的基础,结合copy-and-swap惯用法可以实现强保证。
5. std::shared_ptr的引用计数是线程安全的吗?shared_ptr本身的使用是线程安全的吗?这两个问题有什么区别?
答:这是两个不同层面的问题,必须分开回答。
引用计数的增减是线程安全的,内部用原子操作维护,多个线程同时拷贝或销毁shared_ptr不会导致计数损坏。
但shared_ptr对象本身不是线程安全的。如果多个线程同时读写同一个shared_ptr实例(比如一个线程在reset,另一个线程在解引用),会有数据竞争,因为shared_ptr内部有两个成员(指针和控制块指针),修改它们不是原子的。
实际工程中的正确做法:多个线程各自持有自己的shared_ptr副本(拷贝一份),这样是安全的;如果多个线程要共享同一个shar
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。