# 广联达C++软开岗面经
整个面试下来,问的问题相对基础,基本上都答上来,平时看卡码笔记上的每日一题收获很大。所以基本功要扎实,这样在找工作面试时才会有十足的底气。
# 1.在项目一种如何用小内存实现大容量信息的存储任务的?你们当初是怎么设计的?
答: 简单说就是电脑外接移动硬盘的思想。
stm32f407VG单片机内置的flash是从0x0800 0000这个位置开始存内容的,存满内容到0x080F FFFF结束,总容量为1MB,项目要存8MB的信息。
采用外接flash,内置的flash只存外接flash芯片的地址,真正的内容都在外置的flash中。
# 2.你对STL是怎么理解的?
答: STL是C++标准模板库,是C++语言的核心组成部分,我的理解是,它提供了一套可复用的通用组件,采用模板编程技术,实现了代码与数据类型的分离。
STL包含了四大核心组件:有 容器,算法,迭代器,仿函数这些,详细的说
容器: 用于管理数据集合的模板类,比如顺序容器vector、list,关联容器map、set等。
算法: 定义了用于操作容器中元素的函数模板,如排序sort、查找find,这些算法通过迭代器与容器交互,与具体的数据结构解耦。
迭代器: 充当容器和算法之间的桥梁,提供了一种方法来顺序访问容器中的元素,而不暴露容器的内部实现。
仿函数: 行为类似函数的对象,可以让算法的行为参数化,变得更加灵活。
# 3.STL中的vector和list的机制,讲一下,还有其差异?
答: vector的机制: 可以理解为动态数组,它在堆上分配连续的内存空间,在尾部插入/删除效率高,但在中部插入/删除需要移动后续所有元素,可能效率低。
当当前内存不足时,会重新分配一块更大的内存(通常是翻倍),并将原有元素拷贝过去,这是一个代价较高的操作。它支持随机访问(通过[ ]运算符),效率是O(1)。
list的机制: 是一个双向链表,每个元素存储在独立的节点中,节点通过指针连接,因此,在任意位置插入/删除元素都很快,只需要修改指针。
但不支持随机访问,只能顺序访问,访问某个元素的效率是O(n)。
选择依据: 需要频繁随机访问时用vector;需要频繁在任意位置插入/删除时用list。
# 4.你对C++中的排序算法了解吗?比如说快排,介绍一下你对它的认识。
答: c++标准库中的std::sort算法通常采用IntroSort(内省排序),它是快速排序、堆排序和插入排序的混合算法,平均和时间复杂度为O(N log N),且能避免快排的最坏情况O(n²)。
快排是一种经典的分而治之策略算法。
a.选择基准: 从序列中挑一个元素作为“基准”。
b.分区操作: 重新排列序列,所有比基准小的放在前面,比基准大的放在后面,分区完成后,基准就位于序列的中间位置。
c.递归排序: 递归地将小于基准的子序列和大于基准的子序列进行快速排序。
它的优点是平均性能非常好,是原地排序(只需要很小的辅助栈空间),缓存友好。
缺点是稳定性差(相等元素的相对位置可能改变),且在最坏情况下(如序列已有序)性能较差。
# 5.你对C++中的新特性了解吗?比如说C11的新特性?
答: C++11是现代C++的开端,带来了革命性的变化
自动类型推导(auto): 让编译器自动推导变量类型,简化代码,特别是在迭代器和模板编程中。
智能指针(unique_ptr, shared_ptr, weak_ptr): 用于自动管理动态内存,有效防止内存泄漏。
基于范围的for循环: 简化了对容器元素的遍历操作。
右值引用和移动语义: 允许资源(如动态数组)的所有权转移,而非深拷贝,极大地提升了性能,特别是在返回容器对象或交换操作时。
Lambda表达式: 可以定义匿名函数对象,与STL算法(如sort、find_if)配合使用非常方便,使代码更简洁清晰。
nullptr: 替代NULL,提供了明确的空指针常量。
# 6.你对面向对象了解吗?介绍一下你对它的认识。
答: 了解,面向对象编程是一种以对象为中心的编程范式,其核心思想是封装、继承、多态
a.封装: 将数据(属性)和操作数据的方法(函数)捆绑在一起,并对外隐藏内部实现细节,只提供可控的接口。
通过class关键字定义类,使用private、protected、public访问说明符来控制成员的可见性。
b.继承: 允许基于已有类创建新类,新类继承父类的特性和行为,并可以添加自己的新特性,实现了代码的复用和层次化分类。
使用: public/protected/private BaseClass语法。
c.多态: 允许不同类的对象对同一消息做出不同的响应,提高了代码的抽象性和可扩展性。
通过虚函数机制实现。在基类中将函数声明为virtual,在派生类中进行override。
程序运行时,通过基类指针或引用调用虚函数,会根据指针实际指向的对象类型来调用相应的函数。
# 7.你简历中的一个机器人比赛是19年时参加的,现在的机器人现在跟那个时候是有很大差别的,简单说一下你当时是怎么做的?
答: 这是一个典型的机电一体化系统。我们的工作主要分三块: 机械结构:我们自己用亚克力板等进行激光切割、组装,确保结构稳固,电机和舵机的安装精确。
硬件控制:核心是使用STM32F103单片机作为主控制器,通过编程控制舵机的转动角度和时序,来实现机器人的步态行走,我们需要精细调整每个舵机的速度和角度,让步伐协调。
传感器与算法:机器人搭载了红外传感器,超声波传感器来感知前方障碍物。
单片机读取传感器数据,通过一个简单的判断逻辑,决定是直行、转向还是停止,实现自动避障功能。
整个过程可以看作一个简单的感知-决策-执行闭环。
# 8.做这个比赛对你最大的收获是什么?你有没有想过如果用现有的技术去在做一遍这个比赛,你会做出哪些改进?可以从大语言模型,机器视觉,这些模块进行思考。
答: 最大收获: 最大的收获是完成了从理论到实践的完整闭环。它极大地锻炼了我的动手能力、团队协作精神和解决实际问题的能力。
技术改进: 如果现在用新技术重做,我会从以下几个方面大幅提升其智能化水平:
感知层面(机器视觉): 当时用的是简单的测距传感器,现在,我会为机器人加装一个摄像头,使用OpenCV和轻量化的YOLO目标检测模型,让它不仅能感知障碍物,还能识别障碍物的类型(是人、桌子还是墙),从而实现更智能的避障或交互。
决策层面(大语言模型): 当时的决策逻辑是预设的硬编码,现在,我可以引入大语言模型。
例如,不再是用代码写死“遇到障碍右转”,而是可以让用户用自然语言下达复杂指令,如“请去客厅的茶几旁,但不要碰到地上的玩具”,LLM可以理解指令,并分解成一系列具体的导航决策,下发给机器人的控制单元。
控制与仿真: 在物理机器人制作前,我会先用ROS和Gazebo搭建其仿真模型,在虚拟环境中快速验证算法和步态,这能节省大量调试时间和硬件成本,仿真验证无误后,再将代码部署到实体机器人上。
评论
验证登录状态...