insta360影石c++客户端开发 一面凉经(秒挂)

自我介绍:学校、成绩、项目、实习

面试官迟到10min

1、在实习过程中有接触过QT相关的吗?听过,没有用过。

2、主要是写纯c的代码吗?c和c++都有。

3、实习内容?balabala(提了性能优化)(需要再精简,清晰)。

4、性能优化?balabala。

5、协程库,自己封装的?嗯,是的,自己写这个项目主要是为了学习c++新特性。

6、这个项目主要的工作内容?对c++20协程封装,事件循环,封装异步任务。(这个需要好好总结,每次回答的都不太好)

7、协程怎么用的?异步场景。网络io,对已连接socket fd,对其读,co_await,将协程阻塞,然后可以运行其他协程,当fd可读,在唤醒协程继续执行。如果用线程,就需要将fd加入到io复用监听,然后注册回调函数,事件发生,调用回调函数。相对来说,协程写这些异步代码会比线程简洁。

8、协程对比线程的优点?更轻量级的线程,共享资源。切换开销大。内核态。切换页表。(好好总结,问过好多次了,但是答不好)

9、开发角度,标准库的协程和线程哪个开发效率高?线程。(不知道怎么回答)

10、提到线程,池化概念,线程池,内存池,有了解过吗,为什么做池?需要的时候再申请,就会比较慢,提前创建就会减少这个时间的开销。线程池(说了一下,从任务队列取任务)。

11、智能协同,作过仪表盘?这个只是运用已有的功能进行配置。再说了一下这个项目的大概工作。偏向运维。(他可能更想听到是自己作过界面)

12、http server?尬笑,经典项目。人手一个(是的)

13、mysql和redis都用过吗?redis没用过,扯了一下,说是一个内存数据库

14、mysql和redis的区别?一个轻量级一个重量级,难顶。(回去恶补)

15、视频编解码,渲染,opengl?都没有接触过,苦笑。

16、c++基础,三大特性?抽象、继承、封装、多态。第一个记错了(继承还是封装,他说很基础)

17、静态多态?动态动态?函数重载(我一直说成函数加载)动态多态(虚函数,动态类型、静态类型,基类指针或者引用指向基类对象或者子类对象)

18、怎么理解静态和多态?(一个编译时确定,一个运行时确定)

19、虚函数和纯虚函数区别?抽象类,不能实现,抽象类不能实例化。

20、友元使用过吗?知道,说了一下,但是很少用到。

21、explicit关键字?单参数构造函数,避免隐式初始化。

22、哈希表?最简单就是一个数组。key对应数组下标。哈希函数,哈希桶、哈希碰撞。

23、排序算法,评判标准?时间复杂度、空间复杂度、稳定性。

24、设计模式:单例、工厂、观察者

25、观察者?b观察a,保存a的指针或者引用

26、有没有写博客的习惯?有

27、了解客户端工作?QT,界面。本科用过。

寄,反问:略

总结就是不匹配,基础问题回答烂。

回答优化:

6、封装c++20协程,直接使用会很繁琐,封装成异步任务,开发者只需按照模板即可编写协程代码或者异步代码。当协程需要等待异步结果时,可以co_await等待。事件发生时,会唤醒当前协程继续执行。也提供了一些语法糖支持,wait_for,gather等。提供事件循环支持协程调度。事件循环:获取epoll_wait返回已就绪事件,定时器超时事件,将所有已就绪协程逐一调度执行。

8、协程相对于线程,更加轻量级。切换时不需要进入内核态,在用户态完成,切换时只需将协程状态(寄存器、变量、调用栈)保存到协程状态对象即可,其栈也比线程小。利用协程编写异步io代码更加方便,因为有co_await\co_yield\co_return这几个语法糖。线程编写则很割裂。

10、常见的池有:线程池、内存池、连接池(http\数据库)。共同的特点就是这些资源创建都需要一定的开销,如果每次使用都需要临时申请,cpu时间有相当部分用于创建这些资源。池就可以充分复用资源,降低资源创建开销。

线程池:系统启动时先创建若干线程,每个线程处于睡眠状态,当有任务时,唤醒其中一个线程来消化任务,任务完成,继续睡眠。充分复用线程,避免线程创建和销毁开销过大。(经典场景:一个连接一个线程,不可取,创建慢,连接数有上限)

内存池;预先申请一块较大的空间,后面需要申请内存,直接从这块内存划分,而不是通过系统调用重新申请。当用完释放内存时,将内存放回到池中,而不是直接释放。内存池的优点:有效降低内地申请和释放的开销。主要是减少系统调用的次数。以及能减少内存碎片。

连接池;同样是先创建,后面需要发送信息时直接复用池中连接。提高连接利用率。因为连接创建的开销还是比较大的。如果每次需要时才创建连接,用完就释放连接,这样用于真正数据的收发占比会比较低,因为连接创建需要握手,认证等等步骤。复用连接就能提高数据带宽的占比。例如:创建连接需要3ms,每次发数据固定1ms,池化与非池化对比明显。

16、C++(面向对象)的三大特性为:继承,多态,封装。

25、观察者模式。被观察者(subject)提供添加(attach)或删除(detach)观察者接口(容器、智能指针weak_ptr或者引用保存观察者对象)。通知接口(notify),被观察者(subject)状态发生变化时,一一通知观察者(observer)(调用update接口)观察者提供更新(update)接口。

全部评论
过没过会发邮件嘛
1
1
回复 分享
发布于 07-11 23:16 安徽
佬,是面完就收到邮件吗
1
送花
回复 分享
发布于 07-12 12:40 浙江
阿里云
校招火热招聘中
官网直投
实习吗
点赞
送花
回复 分享
发布于 07-12 10:28 北京
25校招还没开吧😂
点赞
送花
回复 分享
发布于 07-13 01:16 广东
回答优化: 6、封装c++20协程,直接使用会很繁琐,封装成异步任务,开发者只需按照模板即可编写协程代码或者异步代码。当协程需要等待异步结果时,可以co_await等待。事件发生时,会唤醒当前协程继续执行。也提供了一些语法糖支持,wait_for,gather等。提供事件循环支持协程调度。事件循环:获取epoll_wait返回已就绪事件,定时器超时事件,将所有已就绪协程逐一调度执行。 8、协程相对于线程,更加轻量级。切换时不需要进入内核态,在用户态完成,切换时只需将协程状态(寄存器、变量、调用栈)保存到协程状态对象即可,其栈也比线程小。利用协程编写异步io代码更加方便,因为有co_await\co_yield\co_return这几个语法糖。线程编写则很割裂。 10、常见的池有:线程池、内存池、连接池(http\数据库)。共同的特点就是这些资源创建都需要一定的开销,如果每次使用都需要临时申请,cpu时间有相当部分用于创建这些资源。池就可以充分复用资源,降低资源创建开销。 线程池:系统启动时先创建若干线程,每个线程处于睡眠状态,当有任务时,唤醒其中一个线程来消化任务,任务完成,继续睡眠。充分复用线程,避免线程创建和销毁开销过大。(经典场景:一个连接一个线程,不可取,创建慢,连接数有上限) 内存池;预先申请一块较大的空间,后面需要申请内存,直接从这块内存划分,而不是通过系统调用重新申请。当用完释放内存时,将内存放回到池中,而不是直接释放。内存池的优点:有效降低内地申请和释放的开销。主要是减少系统调用的次数。以及能减少内存碎片。 连接池;同样是先创建,后面需要发送信息时直接复用池中连接。提高连接利用率。因为连接创建的开销还是比较大的。如果每次需要时才创建连接,用完就释放连接,这样用于真正数据的收发占比会比较低,因为连接创建需要握手,认证等等步骤。复用连接就能提高数据带宽的占比。例如:创建连接需要3ms,每次发数据固定1ms,池化与非池化对比明显。
点赞
送花
回复 分享
发布于 07-14 16:48 湖北
回答优化: 16、C++(面向对象)的三大特性为:继承,多态,封装。 25、观察者模式。被观察者(subject)提供添加(attach)或删除(detach)观察者接口(容器、智能指针weak_ptr或者引用保存观察者对象)。通知接口(notify),被观察者(subject)状态发生变化时,一一通知观察者(observer)(调用update接口)观察者提供更新(update)接口。
点赞
送花
回复 分享
发布于 07-14 16:48 湖北
提前批吗?
点赞
送花
回复 分享
发布于 07-15 15:32 浙江
佬你是什么时候投的啊
点赞
送花
回复 分享
发布于 07-31 19:20 山东

相关推荐

1. 系统模块在系统组件中,我们需要学习如下模块:•系统 API(应用程序接口):系统 API 提供了用户和应用程序与操作系统交互的方式。通过调用 API,用户程序可以请求操作系统执行特定的任务,如文件操作、进程管理等。•设备驱动程序:设备驱动程序是操作系统与硬件设备之间的桥梁。它们使操作系统能够控制和管理各种硬件设备,如打印机、网络适配器等。•I/O(输入输出):I/O 涉及数据在计算机系统内外的传输。2. 内存模块在内存管理中,我们需要学习如下模块:•物理内存:物理内存是计算机硬件中实际存在的内存单元。操作系统负责管理物理内存的分配和释放。•虚拟内存:虚拟内存允许程序使用比实际物理内存更大的地址空间。操作系统通过虚拟内存管理,将程序的虚拟地址映射到物理内存上。•内存映射:内存映射将文件映射到内存中的一段地址空间,使得可以像访问内存一样访问文件内容。3. 进程模块在进程管理中,我们需要学习如下模块:•进程调度:进程调度决定了哪个进程在何时运行。操作系统需要公平地分配 CPU 时间给不同的进程,以保持系统的平稳运行。•中断处理:中断是硬件事件的通知,操作系统需要及时响应并进行适当的处理。中断处理保证了系统对外部事件的敏感性。•线程与同步:线程允许程序并发执行多个任务。同步机制确保了多个线程之间的数据一致性和协调运行。4. 网络模块在网络组件中,我们需要学习如下模块:•网络协议:网络协议是数据在网络中传输的规则和约定。TCP/IP 协议栈是广泛使用的网络协议,确保了数据的可靠传输。•套接字编程:套接字是网络通信的接口,操作系统通过套接字编程提供了网络通信的能力。套接字允许应用程序通过网络发送和接收数据。•NIC 驱动程序:网络接口控制器(NIC)驱动程序负责管理计算机连接到网络的硬件接口。它们实现了数据在物理层的传输。5. 存储模块在存储管理中,我们需要学习如下模块:•文件系统:文件系统是数据组织和存储的方式,使得文件和目录的管理变得高效。常见的文件系统有 ext4、NTFS 等。•I/O 缓存:I/O 缓存用于加速数据的读写操作。操作系统会在内存中维护一块区域,用于存放最近访问的数据块。•存储设备:存储设备包括硬盘、固态硬盘等。操作系统需要管理这些设备的读写和存储。相关知识下边有文章供参考  c++/嵌入式面经专栏-牛客网 https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
点赞 评论 收藏
分享
31 90 评论
分享
牛客网
牛客企业服务