秋招企业面经

元戎启行

牛客 岁月如歌(关注)

算法:回文子串,二叉树寻找最小路径(回溯比较简单)。跳楼梯

八股:

delete会把内存还给操作系统吗?

进程调用delete或者free释放资源后,实际上是将该内存块标记为可用,并交还给堆管理器。这些资源归还给了这个程序所申请到的堆管理器,堆管理器可以选择将这个内存块重新分配给后续的malloc或new调用,而不必立即将它归还给操作系统。

虚拟内存和物理内存

虚拟内存的执行逻辑(自己理解):当 CPU 访问一个虚拟地址时,MMU 接收到该虚拟地址,并负责将其转换为对应的物理地址。为了完成这个转换,MMU 会使用页表,通过查找页表中的映射关系来确定虚拟地址对应的物理地址。MMU 将虚拟地址作为输入,并根据页表中的映射规则进行查找。一旦找到对应的物理地址,MMU 会将物理地址返回给 CPU。CPU 接收到物理地址后,便可以通过该物理地址访问真正的物理内存。上述的映射过程由 OS (提供页表)和 MMU(根据逻辑地址找到物理地址) 共同实现。对应的段表 / 页表的作用就是提供从虚拟地址空间到物理地址空间的映射(映射过程中,由于 swapping 机制的存在,也有可能出现 swap 的过程)。


new和malloc

返回类型不同:new 返回一个已经初始化的对象指针,malloc 返回一个 void 类型的指针,需要手动进行类型转换;内存大小不同:new 运算符会自动计算需要分配的内存大小,而 malloc 需要手动指定所需内存的大小;new 可以自动调用构造函数初始化内存,而 malloc 不能,需要手动调用构造函数;是否抛出异常:new 在分配内存失败时会抛出 std::bad_alloc 异常,而 malloc 在分配内存失败时会返回空指针。

移动语义,拷贝构造,移动构造

C++11引入右值引用主要是为了实现移动语义完美转发

移动语义:它允许对象的所有权在不进行深拷贝的情况下从一个对象转移到另一个对象。通过引入右值引用和移动构造函数以及移动赋值运算符来解决这个问题。

拷贝构造:重新分配一块新的空间同时将要拷贝的对象复制过来。移动构造:并不是重新分配一块新的空间同时将要拷贝的对象复制过来,而是"拿"了过来,将自己的指针指向别人的资源,然后将别人的指针修改为nullptr。

完美转发:就是通过一个函数将参数继续转交给另一个函数进行处理,原参数可能是右值,可能是左值,如果还能继续保持参数的原有特征,那么它就是完美的。

//不是完美转发
void myforward(int&& i) {  
    cout << "myforward(int&&):" << i << endl;  
    func(i);  
} 

//是完美转发
void myforward(int&& i){  
    cout << "myforward(int&&):" << i << endl;  
    func(std::forward<int>(i));  
}  

vector的底层原理

数据结构:vector底层是一段线性空间(数组),List底层是双向链表。

内存分配:vector在内存分配连续的内存块,可以进行随机访问,但在插入和删除元素的时候可能需要移动其他元素,List通过结点存储指针,可以灵活的插入和删除元素。

内存占用上:vector相比List占用更少的内存空间,因为存储元素时候不需要额外的指针。

vector扩容:当 vector 的大小和容量相等(size==capacity)也就是满载时,如果再向其添加元素,那么 vector 就需要扩容。扩容的步骤->1.完全弃用现有的内存空间,重新申请更大的内存空间2.将旧内存空间中的数据,按原有顺序移动到新的内存空间中 3->最后将旧的内存空间释放。上述也就解释了为啥vector 容器在进行扩容后,与其相关迭代器可能会失效的原因。

resize和reserve区别:1reserve的作用是更改vector的容量(capacity);resize()函数改变的是容器的大小,调用resize(n)后,容器的size即为n。2reserve(n),如果n大于vector当前的容量,reserve会对vector进行扩容,其他情况都不会进行扩容;resize(n)后,容器的size即为n,比原来的变小之后,后面的会被截断,比原来的变大之后,后面的会被填充新的元素。3.reserve是容器预留空间,但在空间内不真正创建元素对象,不能引用容器内的元素;resize可以引用容器内的对象。

c++中struct和class之间的区别

1、默认访问级别:在struct 中,默认的成员访问级别是public,而在 class 中,默认的成员访问级别是private

2、继承方式上:struct默认使用公有继承,class默认使用私有继承。

指针和引用的区别

1、类型不同:指针是变量,存储的是一个内存地址,引用是别名。

2、用法不同:指针可以被重新赋值,引用只是别名,不可以重新赋值。

3、空值处理不同:指针可以为空,引用必须初始化,不能为空。

4、内存管理方式不同:指针需要手动释放,引用不需要。

为什么模板类写在.h中,不在.cpp中

一个程序怎么从文本文件编译成可执行文件

一个C++程序从源码到执行文件,有四个过程,预编译、编译、汇编、链接

预编译:1将所有的#define删除,并且展开所有的宏定义,2处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。3.处理所有的条件预编译指令,如#if、#ifdef

编译:进行词法,语法,语义优化生成汇编代码

汇编:这个过程主要是将汇编代码转变成机器可以执行的指令。

链接:不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。

动态链接和静态链接区别

静态链接:链接的时候就已经把要调用的函数链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行。

动态链接:链接的时候没有把调用的函数代码链接进去,而是在执行的过程中,再去找要链接的函数,生成的可执行文件中没有函数代码,只包含函数的重定位信息。

优缺点:静态链接运行快、可独立运行;动态链接运行较慢不可独立运行。2.静态链接浪费空间,存在多个副本,同一个函数的多次调用会被多次链接进可执行程序,当库和模块修改时,main也需要重编译;动态链接节省空间,相同的函数只有一份,当库和模块修改时,main不需要重编译。

c++与c语言的区别

1、C语言是C++的子集,C++可以很好兼容C语言。但是C++又有很多新特性

2、C++是面向对象的编程语言,引入了类,C语言是面向过程的语言

3、C++可复用性高,C++引入了模板的概念,有更方便开发的标准模板库

RAII机制

通过在对象的构造函数中获取资源,并在对象的析构函数中释放资源,以确保资源的正确管理。

函数模板和类模板

函数模板:建立一个通用的函数,其函数返回值类型和形参类型不具体指定,用一个虚拟的类型代表。

类模板:建立一个通用的类,类的成员数据类型可以不具体指定,用一个虚拟的类型代表。

c++智能指针

首先智能指针是一个类,超过类的作用域会进行析构,所以不用担心内存泄漏。Unique_ptr(独占指针):规定一个智能指针独占一块内存资源。当两个智能指针同时指向一块内存,编译报错。shared_ptr(共享指针):多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放,但是共享指针因为存在循环引用的问题,会造成内存泄漏。Weak_ptr(弱引用指针):weak_ptr的构造和析构不会引起引用计数的增加或减少。我们可以将其中一个改为weak_ptr指针就可以了。

MVCC 的基本原理
mvcc(多版本并发控制):通过undolog和readview来实现的。实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

undolog:用来做数据回滚的

binlog:逻辑日志,做数据备份和恢复的

redolog:内存和磁盘中的数据不一致性,此时计算机断电,就可以使用redolog进行数据恢复。

自己的面经:

1.linux轻量级web服务器的应用场景?

2.web服务器对外提供的服务的协议是什么?

3.如果使用socket+TCP解析应用层的协议是怎么支持的?

4.煤矿项目遇到过哪些技术上的问题,难解决的?

5.dockerhub, docker实际在运行的时候镜像之间能隔离,起到虚拟机的这样一个效果?

7.多线程使用的哪些线程库?标准的线程库?还是特定平台的线程库吧?c++11的线程库?

8.场景题:有两个线程之间共享数据,共享数据是a,b,c=0且是原子的,一个线程将a,b,c赋值为1,2,3。另外一个线程去看是什么样的?

9.opencv中mat对象,哪些格式图像的处理?BGRA为啥大家不太喜欢使用这个东西,和其他格式图像比有哪些优缺点?

10.spdlog,c++中常用的库,spdlog和其他库比起来有哪些区别?

11.其他课程做过哪些稍微完整的项目?

12.线程之间共享数据,可能出现竞争,有哪些手段保证同步互斥的机制?不要说加锁,有没有其他不一样的机制?锁的时间太长了?如果锁的设计,提高并行度?

13.c++11以后的新特性了解吗?

海康威视综合素质面

1.对海康的认识,为什么选择海康

海康在杭州滨江区。有5-6员工,公司的平台很大,在国内很多地方都有分支机构。我是从摄像头认识到海康。通过校招网站上,海康软硬件开发,图像处理,机器人,无人驾驶上都有所招聘。在杭州上面除了阿里,网易之外最大的公司了。

2.能否接受加班

3.项目动机和难题

矿下AI识别平台项目动机和难题

项目动机:业务需求,需要对远程的视频拉流到本地进行处理,在本地进行目标检测算法处                    理并推流到远程服务器。

项目难点:1.算法特定场景识别的准确率不高:增加相关数据集进行训练;提高阈值。

                  2.cpu过载:推流的过程中每连续识别15帧有效推理一次,如果前2帧推理有                               效,后面推理无效清除有效的记录帧数;cpu过载导致的管道处于停止状态,重                         启管道。更好的硬件。

                  3.拉流过程遇到延迟高,通过换usb摄像头,网络摄像头。拉流过程中管道搭建存                         在问题。

webserver

项目动机:当时在学习过程中实践练手的一个项目,主要想通过学习巩固C++、网络编程、                    多线程编程、Linux库函数。

项目难点:1.大文件传输的时候:出现加载不完全,或者不加载的情况。定位到writev的                             m_iv结构体成员有问题,每次传输后不会自动偏移文件指针和传输长度,还会                       按照原有指针和原有长度发送数据。

                  2.整个项目的架构,http报文解析的过程:项目使用使用reactor架构,1.主线程                         负责监听文件描述符;将就绪文件描述符的集合消息读写到httpcoon的用户                             缓冲区上;将httpcoon对象加入到线程池的请求队列上。2.线程池中的线程负                         读取报文,解析报文,响应报文。

项目瓶颈:首先网络设计模式采用的的是单Reactor模型,在主线程里使用一个复用IO承担                      了所有事件的监听,包括读写事件和新连接的到来。这样的一个缺点就是当瞬间                    并发量高的时候,往往新连接不能被及时处理

项目优化:采用多Reactor模型,主线程只负责新连接到达的监听以及新连接的建立,对于                      新到达的连接通过生产者消费者模型分发给子Reactor(另起线程),由子                              Reactor完成已建立连接的读写事件监听任务。这样当有瞬间的高并发连接时,                      也不会出现新连接丢失的情况。
 

4.学校在徐州,为什么选择来杭州

5.父母对你待跨省就业的看法

6.有投递其他公司吗,现在有offer吗

7.期望薪资是多少

月薪2w左右

8.未来职业规划

秋招之前,其实并没有思考过这方面的问题,当时就是想读个研究生找个好工作。然后,最近我也思考过这方面的问题,我想去一个大的平台做专业方面的技术,入职的时候希望努力和前辈的指导能够很快适应职场,在工作2年左右,最好能够升职,成为某个项目的负责人。

9.有关注什么开源社区和项目吗?学到什么?

1.关注过nvidia的社区。jestson-utils、gstreamer进行视频推拉流和应用程序进行交互。

2.关注过模型部署的开源项目fastdeploy,是一个使用简单,场景多变的部署框架。

3.docker的官网也逛过。

4.之前还接触过爬虫相关的框架,selenium。

5.关注过一些社区CVer。

10.GPT相关的咨询?对他的看法

11.GPT对开发有啥帮助

12.最近有遇到过什么压力很大的事情

最近就是在学校准备秋招和写毕业论文。然后我们老师会布置一些活,写个基金本子什么的。就事情比较多,但是压力还好。晚上去操场跑个2-3公里,释放释放压力。平复心态,做好规划。

13.实习经历对你最大的收获

1.学会正视任务,改变心态,提升抗压能力,动起手来,迎难而上。

2.技术上善于倾听组长,老员工的一些建议。

14.学校的团队合作和单位的团队合作有什么不同?

单位上:组长会定制需求,让你去完成,自我完成的过程中首先是以完成任务为导向。 效率会高一点。

学校上:需求其实也比较固定,就是在完成任务时候,同学之间商量更多一点,考虑的东西会更多一点。

小米

1.内存泄漏 和内存泄露的预防方法

概念:内存泄漏(Memory Leak)是指在计算机程序中,由于一些错误或者不恰当的内存管理操作,导致程序无法释放已分配的内存,从而使得可用内存逐渐耗尽或者减少,最终可能导致程序性能下降甚至崩溃的现象。

产生原因:未释放动态分配的内存、循环引用、未及时关闭文件(程序打开了文件,但是使用完之后没有正确的关闭这些资源,导致这些资源一直占用内存,造成泄漏)。

预防方法:避免手动管理内存,使用智能指针RAII技术;确保每次分配内存,都有相应的释放操作,避免循环引用;使用内存分析工具,memleak 可以跟踪系统或指定进程的内存分配、释放请求,然后定期输出一个未释放内存和相应调用栈的汇总情况。

科大讯飞 

1.虚表指针的大小:32位操作系统占用4个字节,64位操作系统占用8个字节。
2. 虚函数存在于哪一段:代码段,虚表指针包含虚函数的入口地址。

3.栈一般多大,堆一般多大?栈一般几百KB-几MB范围,堆一般大得多。

4. 指针和引用的区别?有没有多级指针?有没有多级引用?没有多级引用

5.为什么UDP更快,视频传输选择哪一个?无连接性(没有握手和挥手操作更好的建立连接);低延迟(由于没有连接的建立和维护,以及较少的错误检测和重传机制,UDP通常具有更低的延迟);更小的头部开销: UDP头部相对较小,只有8个字节,而TCP头部至少有20个字节。

6.进程间的通信方式,线程?

7.自旋锁,原子变量?

8.sizeof和strlen的区别?然后给了一个场景?

sizeof就是一个计算数据类型所占空间大小的单目运算符,在计算字符串的空间大小时,包含了结束符\0的位置;而strlen是一个计算字符串长度的函数,使用时需要引用头文件#include <string.h>,不包含\0,即计算\0之前的字符串长度。

9.http和https区别?

  1. http是是明文传输,https则是具有安全性的tls加密传输协议。
  2. https除了三次握手以外,还要进行ssl握手,协商加密使用对称密钥
  3. https需要服务端申请证书,浏览器端安装根证书
  4. 端口也不一样,前者是80,后者是443

10.多态有几种实现方式?

11.右值引用是什么?

12.map和foreach?

13线程池设计思路?

14线程池大小如何确定?

15项目如何和数据库进行连接?

16压测的指标有哪些?

QPS 是 "Queries Per Second" 的缩写,意思是每秒查询次数。

最大并发用户数

吞吐率(Throughput) 是场景运行过程中服务器每秒的吞吐量。其度量单位是字节,表示每个请求连接在任何给定的每一秒从服务器获得的数据量。

平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间/CPU总的执行时间。

内存的使用率。

17如果程序运行过程中断开,该怎么进行排查?

看日志文件

系统资源htop        

看网络连接状态

18多线程死锁了怎么排查

a.gdb attach(gdb工具进行分析)1 gdb attach 6586; 2  thread apply all bt; 3 info threads; 4 thread 1; 4 bt 查看堆栈调用情况

b.coredump(分析核心转储文件) 1 ulimit -c(查看用户级别的系统资源限制 -c是core file size; 2 ulimit -c unlimited;  3 ./deadlock; 4 ps -ef | grep deadlock ;5 CTRL+\(SIGQUIT信号)产生coredump; 6 core.30811 deadlock deadlock.c 查看调用堆栈情况

注意:核心转储文件,是内核拿取信号的时候会判断该信号是否需要生成核心转储文件。 如果需要就会生成。


怎么优化一个程序,更高效的执行
比如循环如何更高效的执行

你有什么好的编程习惯


哈希冲突怎么解决

开放地址法,链式地址法,建立公共溢出区,再哈希表

哈希算法的计算方式,有哪些不同的哈希算法 我没答出来

怎么查看请求从哪个网卡发出的

挥手时的状态

死锁怎么避免

ping是在哪一层,实现的原理是什么

使用过GDB吗,如何使用的;如果出现CPU高使用,应该如何定位调试

 新华三

1.野指针

2.内存泄露
3.数据结构
4.tcp/udp
5.线程/进程
6.算法题目,说说思路,id分配。

7.定时器为什么不多搞几个链表替换时间轮

8.要删除单向链表某个节点,但是只知道这个节点信息,怎么删除(后面他说把该节点后面的信息复制给该节点,我直接??)
9.冒泡排序

10.如何对链表排序

11.网络层与传输层的区别

1.用strlen以及sizeof计算字符串长度的区别

  • sizeof() 是一个运算符,而 strlen() 是一个函数。
  • sizeof() 计算的是变量或类型所占用的内存字节数,而 strlen() 计算的是字符串中字符的个数。
  • sizeof() 可以用于任何类型的数据,而 strlen() 只能用于以空字符 '\0' 结尾的字符串。
  • sizeof() 计算字符串的长度,包含末尾的 '\0',strlen() 计算字符串的长度,不包含字符串末尾的 '\0'。

2.结构体和联合体的区别


3.结构体的内存对齐

联合体内存空间占用:1.满足成员变量(可能是数组)占用最大的内存空间 2.占用的内存空间大小需要是联合体中占用最大内存空间的类型的整数倍

结构体内存空间占用:1.内存起始地址要是每个数据类型的整数倍(存在是否扩充字节)2.占用的内存空间大小需要是结构体中占用最大内存空间的类型的整数倍


4.快速排序的实现
5.指向整数的指针大小和指向字符串指针的大小有什么区别
6.死锁的必要条件


7.ARP协议(数据链路层协议)

主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

ARP地址解析协议用于将计算机的网络地址(IP地址32位)转化为物理地址(MAC地址48位)


9.为什么要内存对齐

为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的“对齐”,比如4字节的int型,其起始地址应该位于4字节的边界上,即起始地址能够被4整除,也即“对齐”跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐

需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据,如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short,第三次为char,然后组合得到整型数据。


10.返回局部变量的地址有什么后果

出现悬空指针,出现未定义的行为。

系统出现卡死 怀疑是死锁导致的 通过哪些手段检测出死锁

1.如系统变得非常缓慢、无响应,或者某些进程无法完成

2.系统检测工具(top)检查系统资源使用情况、CPU、内存、磁盘和网络等方面的性能数据。


发生死锁怎么办

抢占资源:当系统检测到死锁时,可以通过终止某些进程以释放资源,从而解除死锁。这可能会影响进程的正常运行。

回滚:当发生死锁时,系统可以回滚一些进程的状态,将它们恢复到先前的状态,然后重新启动它们以绕过死锁。

超时:设置等待超时时间,如果进程在超时后没有获取资源,它将被释放

加锁怎么加可以避免死锁

有序加锁

使用锁自动释放机制


lock_guard原理

根据 RAII 思想,可将锁的持有视为资源,上锁视为锁的获取,解锁视为锁的释放.

std::lock_guard 就是这样一个工具类,他的构造函数里会调用 mtx.lock(),解构函数会调用 mtx.unlock()。从而退出函数作用域时能够自动解锁,避免程序员粗心不小心忘记解锁。

linux下挂载一个盘 往盘上存储一些数据 需要进行哪些操作

1.查看可用磁盘:使用以下命令之一来查看系统上可用的磁盘,以确定要挂载的磁盘的设备名称 例如:lsblk以层次结构的方式列出块设备信息,包括可用的磁盘和分区。

2.创建挂载点:选择一个目录作为挂载点,通常在/mnt/media目录下创建一个新目录。sudo mkdir /mnt/mydisk

3.挂载磁盘:使用mount命令将磁盘挂载到你创建的挂载点。sudo mount /dev/sdb /mnt/mydisk

4.存储数据:现在,你可以将文件和数据复制到挂载点 /mnt/mydisk 中,就像操作普通目录一样。sudo cp /path/to/your/file /mnt/mydisk

5.卸载磁盘:当你不再需要挂载的磁盘时,可以使用umount命令将其卸载:sudo umount /mnt/mydisk。

进程中的线程怎么看


ps出来的进程信息中针对内存有哪些维度的信息

%MEM:这是进程占用物理内存的百分比。

%CPU:虽然不是内存信息,但也与进程性能相关。这是进程使用的 CPU 时间百分比。

RSS (Resident Set Size):它表示进程实际占用的物理内存。

VSZ (Virtual Memory Size):这是进程的虚拟内存大小。


top指令出来的内存信息有哪些,真正占用的物理内存如何看

RES 列显示了进程实际占用的物理内存大小,是真正占用的物理内存。

%MEM 列显示了进程占用物理内存的百分比,表示 RES 与系统物理内存总量的比例。

const, static关键字

C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。C++的const是在编译阶段替换,C语言的宏是在预编译阶段替换。

define和inline的区别,什么时候用define,什么时候用inline

C++ 内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方

  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值