9.16 面试总结

1.告诉我unique_ptr 一般用于什么场景?

unique_ptr 是独占式智能指针,同一时间只能有一个 unique_ptr 持有这个堆对象所有权,不能拷贝,只能移动 。对象在unique_ptr离开作用域时自动释放内存,防止内存泄漏

使用场景(直接背)

①函数内创建堆对象,函数退出自动释放 不用手动delete,异常退出也能正常释放,避免忘记 delete 导致内存泄漏。

②作为类的成员变量 类里面管理独占资源(比如 fd、缓冲区、自定义对象),对象销毁时自动释放资源,不用在析构手动 delete。

③工厂函数返回值 工厂函数创建对象,返回unique_ptr,把对象所有权交给调用方,语义清晰。

④管理 RAII 资源 不光内存,还可以管理文件句柄、socket 描述符等资源,自定义 deleter,出作用域自动回收。

需要多个指针共享同一个对象 → 用shared_ptr,不是 unique_ptr

2.用过 ai 吗,会用吗

我之前没有深度使用过 AI Agent 相关工具,最近了解到现在开发比较看重 Agent 调用能力,所以这几天主动学习了这块内容。 我在 VSCode 上配置试用了 GitHub Copilot Agent,目前能够用它完成代码阅读、基础框架编写这类基础开发工作。 同时学习了微软开源的 AutoGen 多智能体框架,跑通了一个小 Demo:设置不同角色的 Agent 分工协作,完成图像生成的任务。 如果后续岗位需要更深的 Agent 开发能力,我也会持续深入学习。

3.AutoGen 这个图像生成 demo,两个 Agent 分别是什么角色?

一个 Agent 负责写图像生成提示词,调用绘图模型;另一个 Agent 负责校验提示词、判断图片结果是否满足需求,两个 Agent 来回对话,直到产出符合要求的图片。

3.你用 AI 写代码,会不会依赖 AI,自己写不出来?

不会。AI 对我来说是审查、查错、辅助理解的工具。项目核心架构、核心业务逻辑都是我自己设计手写。遇到底层原理,比如 epoll、IO 多路复用,我会自己啃原理,AI 只是帮我快速定位 bug、解释看不懂的代码片段。所有 AI 生成的代码我都会人工复核。

4.AutoGen 是什么,你用它做了什么?

AutoGen 是微软开源的多智能体 Agent 框架,基于 Python,可以创建多个角色 Agent,互相对话分工。我跑过 Demo,让不同 Agent 分别负责编码、代码审查,协作完成简单任务。它是框架,不是大模型本身,底层需要调用大模型 API。

5.你觉得 AI 对 C++ 服务器开发有什么帮助,有什么风险?

帮助:快速定位内存问题、重构代码、写注释、构造测试用例,查阅系统接口。 风险:幻觉,写出内存不安全、并发有问题的 C++ 代码;对底层并发、网络模型容易出错。所以必须人工审核,结合编译、gdb 调试、压测来验证。

6.你理解的 Agent 是什么?

Agent 就是带有规划、工具调用能力的智能体,能够拆解任务、自主调用工具,多 Agent 还可以分工协作完成复杂任务。

7.你只是跑了 Demo,如果要集成到 C++ 服务器项目怎么做?

答:AutoGen 原生是 Python 框架。如果 C++ 项目要接入,一种方案是 C++ 通过网络调用 Python 服务;另一种方案就是自己在 C++ 侧封装简易 Agent 能力。

8.讲一讲qt中的信号槽机制是什么?本质是什么?

信号槽具备跨线程通信的能力,但不是无条件天然跨线程。 默认 AutoConnection 会自动判断收发对象是否在不同线程:跨线程就自动使用队列连接 QueuedConnection,把事件投递到接收方线程事件循环异步执行;同线程则同步调用。 如果强制指定 DirectConnection,就算跨线程,槽函数依然在信号发射线程执行。跨线程使用时,接收线程必须有事件循环,自定义参数类型要注册元类型。

9.讲一讲在qt开发中你还有什么方法进行筛选对应的信号?

10.讲一讲qt开发中线程间通信时怎么回事?

11.为什么你的时间轮的实现没有想过用小根堆?

小根堆(优先队列)也可以做定时器,muduo 早期版本就用过小根堆,但是有几个短板:

① 时间复杂度差异 小根堆:新增定时器 O (logN),获取最近到期定时器 O (1),删除定时器 O (logN)。N 是定时器总数,定时器越多,logN 开销越大。

② 时间轮:添加定时器、删除定时器都是 O(1),只需要计算槽位,放入对应链表。大量定时器场景下性能更好。

③ 删除操作痛点 小根堆最难处理取消定时器。如果要删除一个中间的定时器,不能直接从堆里删掉,一般采用懒删除:标记定时器失效,堆不主动删,等到堆顶取出的时候,判断标记,如果失效就丢弃。会造成堆里面堆积大量无效定时器,占用内存。

④ 业务场景匹配 我的项目是 TCP 服务器,大量短连接、频繁创建销毁定时器(比如连接超时),定时器数量多、增删非常频繁。这种场景时间轮更适合。

缺点补充(主动说,显得理解全面): 时间轮有精度限制。时间轮的精度等于 tick 间隔,不能做到任意时间精度;如果定时时间远超轮子一圈大小,需要多层时间轮(分级时间轮)。而小根堆可以支持任意超时时间,没有范围限制。

一句话总结: 小根堆适合定时器数量少、删除不频繁的场景;我的服务器会高频增删大量连接超时定时器,时间轮 O (1) 增删更适合,所以选用时间轮而不是小根堆。

懒删除:业务主动取消定时器的时候,不会直接去堆里面删掉元素 (堆中间删除代价 O (n),再堆化 O (logN))。 只在定时器对象内部打一个标记isCancel。 等到这个元素跑到堆顶,取出的时候,先判断标记:

  • 如果标记是已取消:不执行回调,直接丢弃这个定时器(懒删除);
  • 如果没取消:执行回调。 堆里会残留很多已经取消的无效定时器,慢慢堆积,这就是小根堆方案的短板,也是你选用时间轮的理由。

12.为什么要有时间轮?

13.讲一讲你在开发中遇到的最大的问题,以及你是怎么解决的?

14.挑选一个做得深入的项目,讲难点、困难、解决过程

我讲实习中频谱监测上位机的 IQ 数据接收模块。项目接收 FPGA 下发万兆 UDP 的 IQ 原始数据流,速率达到 400MB/s。UDP 本身不可靠,会出现乱序、数据包到达顺序错乱的问题。 我在应用层设计包序号重排机制,维护接收缓冲区,依据数据包序列号完成排序重组,最终数据完整率可以达到 95% 以上。 开发初期,数据接收处理、UI 绘图全部放在 Qt 主线程,大量数据计算阻塞事件循环,造成界面卡顿。我改成多线程架构,子线程负责 UDP 接收和数据解析,利用 Qt 跨线程信号槽把处理完成的数据投递 UI 线程渲染,规避子线程直接操作 UI 的问题。 另外大数据量绘图会出现时间轴失真,我实现抽取率控制逻辑做降采样,解决波形绘制失真;同时为了防止程序崩溃损坏采集的数据,采用临时文件缓冲写入 + 原子 rename 重命名的持久化方案,保证文件完整性。

我个人实现仿 muduo 高并发 TCP 服务器,采用主从 Reactor、One‑Loop‑Per‑Thread 模型。其中定时器模块我没有直接照搬 muduo 的小根堆,自己基于 timerfd 实现单层时间轮。 使用数组作为时间轮槽位,每个槽挂载定时器链表;定时器对象使用 shared_ptr 管理,实现懒删除。外部取消定时器只释放自身 shared_ptr,时间轮 tick 遍历的时候依靠引用计数判断任务是否已经取消。eventfd 用来跨线程唤醒 epoll 阻塞,任务队列保证跨线程调用安全。单层时间轮适合短时间的连接超时场景,增删任务 O (1),缺点是定时的最大时长有限。

15.讲实习遇到的联调问题(你讲的抓包排查 FPGA 参数问题)

在和 FPGA 硬件联调的时候,出现上位机收不到 IQ 数据的现象。一开始分不清问题出在硬件还是软件。我没有直接判定对方问题,先用抓包工具确认本机网卡完全没有收到 UDP 数据包,说明报文根本没有到达应用层。但是硬件同事认为是上位机代码的问题。我就把抓包证据、分析推断整理文档提交,最后定位到是 FPGA 端参数配置错误。这件事让我意识到跨岗位协作排错,要先拿到客观证据,再沟通定位问题,不能只靠主观猜测。

16.你对工业软件怎么理解?

我专业接触过仿真类实验软件。我理解工业软件和普通业务软件不一样,既要做底层的数据采集、处理,又要做上层可视化界面,对稳定性、数据可靠性要求很高。我实习做的频谱上位机,就属于工业采集类软件,需要处理高速数据流,还要保证异常情况下数据不损坏。我有 Qt 上位机开发经验,能够理解工业软件数据处理和 UI 界面分离的开发思路。

17.你的职业发展倾向?

我简历有两部分积累:一是 Linux C++ 网络服务器开发,实现过 Reactor 网络库;二是 Qt C++ 上位机开发,做过高速数据接收与可视化。贵司岗位是 C++ 工业软件方向,不管偏向底层业务逻辑,还是客户端界面开发我都愿意接受,我可以快速补齐业务领域知识。

18.AI 编程工具怎么使用?

在之前的国防相关实习项目中,出于保密要求,不能把业务代码直接交给 AI。我一般只把 bug 现象、报错信息拿给 AI,获取排查思路,不会让 AI 直接生成业务完整代码。业余也简单了解过 Agent 相关框架做学习。

19.指针和引用的区别

20.基类构造函数调用虚函数,实例化派生类对象执行哪个版本?

相关推荐
是店小二呀3 小时前
鸿蒙PC_Dart-Sass-ohos适配全记录
linux·运维·windows
充电zcx10 小时前
Linux:4:开发工具详解
linux·运维·服务器
Alice-YUE12 小时前
工业级 AI Agent 架构:5 层、2 范式、4 原则,一次讲透
面试·系统架构·大模型·ai agent·智能体
码农客栈14 小时前
linux 交叉编译tslib
linux
鱼月半14 小时前
两台电脑直连网络不通怎么办?
linux·网络协议
光电笑映15 小时前
网络通信基础:从协议分层到 Socket 编程预备
linux·运维·服务器·网络
酸菜。15 小时前
dw_apb_gpio总结
linux
TrebleZ15 小时前
为什么总爱问Java中怎么判断两个对象是相同的
面试
wunaiqiezixin16 小时前
MIT 6.S081 file system 实验篇(lab9):Large files (moderate)
linux·unix·os·xv6·mit6.s081