C++ 面试问题全解析

目录

一、蔚来 C++ 软开一面问题分析

1. 面试情况概述

2. 八股文问题解析

二、中科曙光 C/C++ 研发工程师一面问题分析

1. 面试情况概述

2. 问题解析


一、蔚来 C++ 软开一面问题分析

1. 面试情况概述

蔚来 C++ 软件开发一面时长 45 分钟,其中前 30 多分钟围绕项目进行深入询问,后面对八股文进行考查。然而,由于面试官对面试者的项目不太熟悉,导致面试者需要花费较长时间进行描述。

2. 八股文问题解析

  • 线程间通讯方式
    • 线程间通信方式主要有共享内存、消息队列、条件变量等。共享内存是多个线程可以直接访问同一块内存区域,通过对内存的读写来进行通信;消息队列可以让线程之间通过发送和接收消息来进行通信;条件变量通常与互斥锁配合使用,用于线程之间的同步和等待特定条件的满足。
  • TCP 能发广播报文么
    • TCP 连接后不能发广播报文,但在连接之前可以在特定情况下发送广播报文,例如在进行地址解析协议(ARP)请求时。
  • TCP 和 UDP 的区别
    • TCP 是面向连接的、可靠的传输协议,具有流量控制、拥塞控制等机制,保证数据的顺序性和正确性;UDP 是无连接的、不可靠的传输协议,不保证数据的顺序和正确性,但传输速度快,开销小。
  • UDP 可以广播报文么
    • UDP 可以发送广播报文。UDP 广播是将数据包发送到同一子网内的所有主机。
  • 描述一下 SOCKET 连接过程
    • SOCKET 连接过程通常包括以下步骤:
      • 创建套接字:使用 socket 函数创建一个套接字,指定地址族(如 IPv4 或 IPv6)、套接字类型(如流式套接字或数据报套接字)和协议。
      • 绑定地址:如果需要服务器端接收连接请求,需要将套接字绑定到一个特定的地址和端口号上。
      • 监听连接:服务器端使用 listen 函数监听连接请求。
      • 接受连接:服务器端使用 accept 函数接受客户端的连接请求,返回一个新的套接字用于与客户端通信。
      • 连接服务器:客户端使用 connect 函数连接到服务器的地址和端口号。
      • 数据传输:连接建立后,客户端和服务器端可以使用 send 和 recv 函数进行数据传输。
      • 关闭连接:通信结束后,使用 close 函数关闭套接字。
  • 你了解我们岗位么
    • 在面试前应该充分了解应聘岗位的职责和要求,包括工作内容、所需技能、团队协作等方面。可以通过查看岗位描述、公司官网、行业资讯等途径来了解岗位信息。

二、中科曙光 C/C++ 研发工程师一面问题分析

1. 面试情况概述

中科曙光 C/C++ 研发工程师一面时长 20 分钟,面试官语速快,问题密集,不给面试者缓冲时间。面试内容主要包括自我介绍、实习项目细节、技术问题等。

2. 问题解析

  • 实习项目细节
    • 详细描述实习项目的背景、目标、技术架构、实现过程以及遇到的问题和解决方案。突出自己在项目中的贡献和所学到的技能。
  • 视觉识别算法是什么
    • 解释视觉识别算法的概念和作用,例如目标检测、图像分类、语义分割等。可以提及一些常见的视觉识别算法,如 YOLO、ResNet、VGG 等。
  • 是你们团队只会 YOLO v5 还是甲方要求使用这个
    • 说明选择 YOLO v5 的原因,可能是其性能优势、适用性、团队熟悉程度等。如果是甲方要求使用,可以解释甲方的需求和考虑因素。
  • 为什么选择 YOLO v5,它的优势是什么
    • YOLO v5 的优势包括速度快、准确性高、易于部署等。可以具体说明其在检测速度、精度、模型大小等方面的优势,以及与其他视觉识别算法的比较。
  • YOLO 系列算法都有哪些层
    • YOLO 系列算法通常包括卷积层、池化层、全连接层等。可以详细描述每个层的作用和特点,以及它们在算法中的位置和连接方式。
  • 讲一下最新的这篇论文思路
    • 如果熟悉相关的最新论文,应该能够清晰地阐述论文的主要思路、创新点和实验结果。包括问题的提出、方法的设计、实验的设置和结论的得出。
  • 讲一下每一层的原理
    • 对于 YOLO 系列算法中的每一层,应该能够解释其工作原理和作用。例如,卷积层用于提取图像特征,池化层用于降低特征图的分辨率,全连接层用于进行分类和回归等。
  • 讲一下 MHA 为什么有提升
    • 如果涉及到多头注意力机制(MHA),应该能够解释其提升性能的原因。例如,MHA 可以同时关注不同位置的信息,提高模型的表达能力和泛化能力。
  • 讲一下 BiLSTM 作用
    • 解释双向长短期记忆网络(BiLSTM)的作用,例如在序列数据处理中的优势,能够捕捉前后文信息,提高模型的性能。
  • 单卡训练还是多卡训练
    • 说明在项目中使用的训练方式,单卡训练和多卡训练各有优缺点。单卡训练简单方便,但训练速度可能较慢;多卡训练可以提高训练速度,但需要考虑数据并行和模型并行等问题。
  • 对多卡训练的配置了解
    • 如果使用多卡训练,应该了解多卡训练的配置方法,包括硬件设备的选择、软件框架的设置、数据并行和模型并行的实现等。
  • 内存泄漏、原因、解决方法
    • 内存泄漏是指程序在运行过程中动态分配的内存没有被正确释放,导致内存占用不断增加。原因可能包括忘记释放内存、循环引用、异常处理不当等。解决方法包括使用智能指针、及时释放资源、避免循环引用等。
  • vector 的底层原理
    • std::vector 是 C++ 标准库中的动态数组容器。其底层实现通常是通过连续的内存空间来存储元素,当需要增加容量时,会重新分配一块更大的内存空间,并将原有的元素复制到新的内存空间中。vector 还提供了一些成员函数,如 push_back、pop_back、at 等,用于方便地操作元素。
  • vector 和 list 的区别
    • vector 和 list 都是 C++ 标准库中的容器,但它们有一些不同之处:
      • 内存分配方式:vector 采用连续的内存空间存储元素,list 采用链表结构存储元素。
      • 随机访问性能:vector 支持随机访问,可以通过下标在常量时间内访问元素;list 不支持随机访问,只能通过迭代器依次访问元素。
      • 插入和删除操作性能:在 vector 的中间位置进行插入和删除操作可能需要移动大量元素,时间复杂度较高;在 list 的任意位置进行插入和删除操作只需要修改指针,时间复杂度为常量。
  • malloc 和 new
    • malloc 和 new 都是 C++ 中用于动态分配内存的方法,但它们有一些区别:
      • 功能:malloc 是 C 语言中的内存分配函数,只负责分配内存,不进行对象的构造;new 是 C++ 中的运算符,不仅负责分配内存,还会调用对象的构造函数进行对象的初始化。
      • 返回值:malloc 返回 void* 类型的指针,需要进行类型转换;new 返回对象的指针,不需要进行类型转换。
      • 异常处理:malloc 分配内存失败时返回 NULL,可以通过判断返回值来处理内存分配失败的情况;new 在分配内存失败时会抛出 std::bad_alloc 异常,可以通过捕获异常来处理内存分配失败的情况。
  • free 和 delete
    • free 和 delete 都是用于释放动态分配的内存的方法,但它们有一些区别:
      • 对应关系:free 用于释放由 malloc 分配的内存;delete 用于释放由 new 分配的内存。
      • 释放对象:delete 会调用对象的析构函数,释放对象占用的资源;free 只释放内存,不调用对象的析构函数。
  • C++ 程序编译步骤
    • C++ 程序的编译通常包括以下步骤:
      • 预处理:对源代码进行预处理,包括宏展开、头文件包含等。
      • 编译:将预处理后的源代码编译成汇编代码。
      • 汇编:将汇编代码汇编成机器代码。
      • 链接:将多个目标文件和库文件链接成可执行程序。
  • Python 了解多吗
    • 根据自己对 Python 的了解程度进行回答,可以提及 Python 的特点、应用场景、常用库等方面。
  • Python 装饰器
    • Python 装饰器是一种用于修改函数或类行为的语法糖。它可以在不修改原函数代码的情况下,为函数添加额外的功能。装饰器通常是一个函数,它接受一个函数作为参数,并返回一个新的函数。
  • 深拷贝和浅拷贝
    • 浅拷贝是指创建一个新的对象,但其成员变量仍然指向原对象的成员变量。深拷贝是指创建一个新的对象,并且其成员变量也都是新的对象,与原对象完全独立。在 C++ 中,可以通过自定义拷贝构造函数和赋值运算符来实现深拷贝。
  • Linux 系统了解多吗
    • 根据自己对 Linux 系统的了解程度进行回答,可以提及 Linux 的命令行操作、文件系统、进程管理、网络配置等方面。
  • Linux 基础命令
    • 一些常见的 Linux 基础命令包括 ls(列出文件和目录)、cd(切换目录)、pwd(显示当前目录)、mkdir(创建目录)、rm(删除文件或目录)、cp(复制文件或目录)、mv(移动文件或目录)、cat(查看文件内容)、grep(在文件中查找特定字符串)等。
  • 平时 Windows 和 Linux 哪个用的多
    • 根据自己的实际使用情况进行回答,并说明在不同操作系统下的使用场景和体验。
  • 调试用什么方式
    • 在 C++ 开发中,可以使用调试工具如 GDB(GNU Debugger)进行调试。GDB 可以设置断点、查看变量值、单步执行等,帮助开发者找出程序中的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值