昆仑天工 - C++软件开发 一面

1. 自我介绍

(开放性问题,候选人应包含教育背景、技术栈、项目经验、个人优势,控制在2分钟以内)

2. vector和list的区别是什么?各自适合什么场景?

参考答案:底层结构不同导致性能特性完全不同:

  • vector底层是连续内存数组,list底层是双向链表
  • 随机访问:vector支持O(1)下标访问,list不支持随机访问只能遍历O(n)
  • 插入删除:vector在中间插入需要移动元素O(n),list在任意位置插入只需修改指针O(1)
  • 内存:vector内存连续缓存友好,list每个节点单独分配内存有额外指针开销
  • 扩容:vector容量不足时会重新分配并拷贝所有元素,list无此问题
  • 适用场景:vector适合频繁随机访问、尾部增删的场景;list适合频繁在中间插入删除、不需要随机访问的场景

3. C++的动态内存管理机制是怎样的?

参考答案:C++提供了两套动态内存管理机制:

  • 底层机制:new/delete和malloc/free。new会调用构造函数,delete会调用析构函数;malloc/free只分配释放内存不涉及对象构造
  • 内存分配来源:堆内存,由操作系统管理,程序员手动申请和释放
  • 常见问题:内存泄漏(申请未释放)、野指针(释放后继续使用)、重复释放(double free)
  • 现代C++解决方案:智能指针自动管理内存生命周期 unique_ptr:独占所有权,不可拷贝,离开作用域自动释放shared_ptr:共享所有权,引用计数为0时自动释放weak_ptr:弱引用,不增加引用计数,解决循环引用问题
  • RAII原则:资源获取即初始化,利用对象析构函数自动释放资源,是C++内存管理的核心思想

4. 什么是虚函数表?多继承下虚函数表是怎么工作的?

参考答案:虚函数表是C++实现运行时多态的底层机制:

  • 每个含有虚函数的类都有一张虚函数表(vtable),存储该类所有虚函数的地址
  • 每个对象实例的内存起始位置有一个虚函数指针(vptr),指向所属类的虚函数表
  • 调用虚函数时,通过vptr找到vtable,再根据函数索引找到实际函数地址并调用,实现运行时多态
  • 派生类会继承基类的vtable,并将被重写的虚函数地址替换为自己的实现

多继承下的虚函数表:

  • 派生类会有多个vptr,每个基类对应一个
  • 对象内存布局中,每个基类子对象都有自己的vptr
  • 调用不同基类的虚函数时,使用对应基类的vptr
  • 菱形继承会导致基类数据重复,需要用虚继承解决,虚继承会引入虚基类表(vbtable)

5. 多继承有哪些弊端?

参考答案:多继承功能强大但问题也多:

  • 菱形继承问题:D继承B和C,B和C都继承A,D中会有两份A的数据,造成数据冗余和二义性访问
  • 命名冲突:多个基类有同名函数时,调用时产生二义性,需要显式指定基类
  • 内存布局复杂:多个vptr增加对象大小,内存布局复杂难以理解
  • 维护困难:继承关系复杂,代码可读性差,修改一个基类可能影响多个派生类
  • 虚继承开销:解决菱形继承需要虚继承,引入额外的vbtable和间接访问开销
  • 实践建议:优先使用组合代替继承,多继承只用于接口类(纯虚函数类),避免多继承实现类

6. C++11的右值引用和移动语义是什么?

参考答案:右值引用和移动语义是C++11最重要的性能优化特性:

  • 左值和右值:左值有明确的内存地址可以取地址,右值是临时对象或字面量没有持久地址
  • 右值引用(&&):专门绑定到右值,延长临时对象的生命周期
  • 移动语义:通过移动构造函数和移动赋值运算符,将资源的所有权从一个对象转移到另一个对象,而不是拷贝
  • 核心价值:避免不必要的深拷贝,将O(n)的拷贝操作变成O(1)的指针转移
  • std::move:将左值强制转换为右值引用,触发移动语义,转移后原对象处于有效但未定义状态
  • 典型场景:函数返回大对象、容器插入元素、unique_ptr转移所有权
  • 完美转发:std::forward配合万能引用,保持参数的左值/右值属性传递给下一个函数

7. 动态多态和静态多态的区别及使用场景?

参考答案:两种多态的实现机制和性能特性完全不同:

  • 动态多态:通过虚函数和继承实现,运行时根据对象实际类型决定调用哪个函数 实现:基类声明virtual函数,派生类override开销:虚函数调用需要通过vptr间接寻址,有运行时开销场景:对象类型在运行时才能确定,如插件系统、工厂模式、游戏中不同类型的角色
  • 静态多态:通过模板和函数重载实现,编译期确定调用哪个函数 实现:函数重载、运算符重载、模板特化、CRTP(奇异递归模板模式)开销:编译期展开,零运行时开销场景:类型在编译期已知,追求极致性能,如STL容器、数学库
  • 选择原则:类型关系在编译期确定用静态多态,运行时才能确定用动态多态;性能敏感场景优先静态多态

8. 如何在二叉树中找到两个节点的最近公共祖先?

参考答案:最近公共祖先(LCA)是经典算法题,有多种解法:

  • 递归解法(最优): 如果当前节点为空或等于p或q,直接返回当前节点递归在左子树和右子树分别查找p和q如果左右子树各找到一个,说明当前节点就是LCA如果只有一侧找到,说明两个节点都在那一侧,返回那一侧的结果时间复杂度O(n),空间复杂度O(h),h为树高
  • 路径比较法:分别找出根节点到p和q的路径,然后找两条路径最后一个公共节点
  • 父节点记录法:用哈希表记录每个节点的父节点,然后

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

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

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

全部评论

相关推荐

05-04 08:23
东南大学 C++
一、基本情况与项目背景1.请做一个简单自我介绍。2.详细介绍一下你在字节做的端智能 SDK / 特征平台项目。3.端上的原始数据流主要包含哪些内容?4.这些数据是在端上落库,还是会上报云端?两条链路分别做什么?5.业务方如何注册、消费自定义特征?二、设备特征缓存优化6.设备特征缓存优化的背景是什么?原来性能瓶颈在哪里?7.为什么设备特征可以牺牲一部分时效性来换性能?8.为什么从统一 TTL 改成 2 秒 / 10 秒 / 90 秒分层 TTL?9.不同 TTL 档位分别适合哪些设备特征?10.你们是如何通过打点、实验和 A/B 验证优化效果的?三、C++ 智能指针11.你对 C++ 智能指针的理解是什么?12.unique_ptr、shared_ptr、weak_ptr 分别适合什么场景?13.shared_ptr 的引用计数机制是什么?14.weak_ptr 如何解决 shared_ptr 的循环引用问题?四、特征 SQL 复用优化15.端上 SDK 为什么会涉及 SQL 复用优化?16.端上本地数据库里存的是什么,业务方为什么会查它?17.特征 SQL 查询的性能瓶颈是什么?18.为什么这些 SQL 可以模板化、签名化和合并?19.为什么第一版 UNION ALL 优化效果不理想?20.后续“提取时间戳 + 最小时间戳查询 + 应用层分发”的方案是怎么做的?21.SQL 优化最终在单模块和全链路上分别带来了多少收益?五、直播端智能 / ABR 开放题22.你了解 ABR 吗?23.如果要判断用户是“画质敏感型”还是“流畅度敏感型”,你会在端上采集哪些特征?24.你会如何结合设备信息、网络状态、历史行为来设计直播画质 / 流畅度策略?25.端智能场景里,你是否接触过模型推理链路?六、AI 投资分析系统 / Multi-Agent26.介绍一下你的多 Agent 投资分析系统。27.主控 Agent、数据 Agent、新闻 Agent、知识库 Agent、分析 Agent 分别负责什么?28.多 Agent 之间的数据和上下文是怎么流转的?29.相比单 Agent,多 Agent 架构在上下文管理、幻觉控制和问题排查上有什么优势?30.多 Agent 架构会带来哪些复杂度和维护成本?31.真实金融行情数据是如何通过 API 接入系统的?七、Skill / 智能日志分析开放题32.你有没有自己写过 skill?平时如何使用 skill?33.如果要做一个直播播放日志智能分析工具,你会设计成 Agent 还是 Skill?为什么?34.如果有历史文档和代码库说明日志含义,你会如何构建知识库或 RAG?35.用户反馈某个视频播放卡顿时,如何定位、筛选并分析对应播放日志?36.日志分析系统里,工具调用、RAG、意图识别、日志筛选、错误码解释分别怎么设计?37.你会选择 ReAct、Plan-and-Execute,还是其他框架来实现这个日志分析系统?八、计算机网络 / 拥塞控制38.你了解拥塞控制吗?它主要解决什么问题?39.拥塞窗口是如何变化的?40.慢启动、拥塞避免、丢包后的窗口调整分别是怎么回事?九、C++ 基础 / 多态41.说一下 C++ 的多态特性。42.静态多态和动态多态分别是什么?43.动态多态如何通过继承、虚函数、虚函数表实现?十、Git 基础44.你实习开发中常用哪些 Git 指令?45.你平时如何创建分支、提交代码、推送代码、拉取更新?46.遇到 Git 冲突一般怎么处理?十一、算法题:两个有序数组中位数47.用 C++ 实现两个有序数组取中位数。48.先讲一下你的解题思路。49.暴力合并排序方案有什么可以优化的地方?50.既然两个数组本身有序,能否用双指针合并,避免再次 sort?51.有没有更高阶的二分解法?十二、实习时间与岗位匹配52.你本科期间是怎么安排时间去北京字节实习的?53.如果来小红书实习,最早什么时候可以到岗?54.你更倾向上海还是北京 base?55.你对“产品工程师”这个岗位定位的理解是什么?56.你对直播 SDK / 播放器 SDK / 端智能策略方向是否感兴趣?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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