OPPO C++ 软件开发 一面 面经

1. 自我介绍

答:

  • 按"个人背景 → 核心技术栈 → 代表项目 → 求职意向"四段走,控制在2分钟
  • 重点突出和岗位相关的经验,不要把简历从头念一遍
  • 结尾说一句为什么对OPPO感兴趣,体现你做过功课

2. 你做过的项目里,技术上最有挑战的是哪个,难在哪里?

答:

  • 这道题考察技术深度和解决问题的能力,不是简历复读
  • 回答结构:项目背景(一句话)→ 具体的技术难点(说清楚难在哪,不能说"功能复杂")→ 你的解法(为什么这么做)→ 结果
  • 面试官会顺着你说的细节追问,只说你真正主导过的部分
  • 难点要具体:比如"多设备并发上报导致消息乱序"比"系统很复杂"有说服力得多

3. 请解释C++中的虚函数机制,vtable是怎么工作的?

答:

  • 每个含虚函数的类有一张vtable(虚函数表),存放在只读数据段,表中按声明顺序存放虚函数指针
  • 每个该类的对象头部有一个隐藏的vptr,指向所属类的vtable
  • 调用虚函数时:通过对象的vptr找到vtable,再通过函数在表中的固定偏移找到函数指针,间接调用
  • 派生类重写虚函数时,vtable中对应槽位的指针被替换成派生类的实现
  • 开销:每个对象多一个vptr(8字节),每次虚函数调用多一次间接寻址,无法内联
  • 多继承时对象有多个vptr,每个基类子对象对应一个

4. 请解释C++中的智能指针,unique_ptr和shared_ptr的底层实现有什么区别?

答:

  • unique_ptr:独占所有权,内部只有一个裸指针,不能拷贝只能移动,sizeof和裸指针相同(无额外开销),析构时直接delete
  • shared_ptr:共享所有权,内部有两个指针:一个指向对象,一个指向控制块(control block)
  • 控制块包含:强引用计数(shared_ptr数量)、弱引用计数(weak_ptr数量)、删除器、分配器
  • 引用计数用原子操作维护,保证线程安全(计数本身安全,但shared_ptr对象本身不是线程安全的)
  • make_shared的优化:一次分配同时创建对象和控制块,减少一次内存分配,cache友好性更好
  • 循环引用问题:A持有B的shared_ptr,B持有A的shared_ptr,引用计数永远不为0,用weak_ptr打破循环

5. 请解释C++中的move语义,什么情况下移动构造函数会被调用?

答:

  • 移动语义允许"窃取"临时对象的资源(转移指针所有权),而不是深拷贝,O(1)完成
  • 移动构造函数被调用的场景: 用右值(临时对象)初始化新对象:MyClass b = std::move(a)函数返回局部对象(编译器优先RVO,RVO不适用时用移动)容器扩容时移动元素(前提是移动构造函数声明了noexcept,否则退化成拷贝)往容器里插入临时对象
  • 移动后原对象处于"有效但未定义"状态,不能再使用其值,但可以赋值或析构
  • 移动构造函数应该声明noexcept,否则std::vector扩容时不会使用移动,性能损失

6. 请解释C++中的模板,你在项目里用过哪些模板相关的技巧?

答:

  • 模板是泛型编程的基础,编译期生成具体类型的代码,零运行时开销
  • 函数模板:类型参数化的函数,编译器根据实参自动推导类型
  • 类模板:类型参数化的类,如std::vector<T>,使用时需要指定类型
  • 项目中常用的技巧: CRTP(奇异递归模板模式):实现静态多态,消除虚函数开销,适合高频调用的接口模板特化:为特定类型提供优化实现,如对bool类型做位压缩if constexpr(C++17):编译期条件分支,根据类型特征选择不同实现,比enable_if更直观类型萃取(type traits):std::is_integral、std::is_pointer等,在编译期判断类型特征
  • 模板定义必须放在头文件,因为实例化发生在调用点

7. 请解释Linux中的文件描述符,select/poll/epoll有什么区别,你在项目里用过哪个?

答:

  • 文件描述符(fd)是内核为每个进程维护的整数索引,指向内核的文件/socket/管道等对象
  • select:把fd集合从用户态拷贝到内核,内核遍历所有fd检查就绪状态,O(n),fd上限1024,每次调用都要重新设置fd集合
  • poll:和select类似,用链表替代位图,没有fd数量限制,但仍然是O(n)遍历,每次调用仍要拷贝整个fd数组
  • epoll:事件驱动,epoll_ctl注册fd时内核建立回调,fd就绪时直接加入就绪链表,epoll_wait只返回就绪的fd,O(就绪数量),适合大量连接但活跃连接少的场景
  • ET(边缘触发)vs LT(水平触发):E

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++八股文全集 文章被收录于专栏

本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。

全部评论

相关推荐

评论
1
2
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务