网易社招面试(牛客上的面经,找了答案记录下来)

1.struct和union的区别
1)在任何同一时刻, union存放一个被选中的成员, 而struct存放所有的成员变量。
2)对于union的不同成员赋值,将会对其他成员重写, 原来成员的值就不存在了, 而对于struct的不同成员赋值是互不影响的
3)内存分配不同
union的大小为其内部所有变量的最大值,按照最大类型的倍数进行分配大小。
struct分配方法类似,也是按照最大类型的倍数进行分配大小,但是还与顺序有关。
Struct 和 Union 的详细区别

2.虚函数的作用及实现原理
虚函数的作用:实现类的多态性。
实现原理:虚表指针+虚函数表。每个类使用一个虚函数表,每个类对象用一个虚表指针。
虚函数的作用及其底层实现机制

3.局部变量、全局变量、常量还有malloc开辟的内存变量分别放在哪个区
在C/C++中内存分为5个区,分别为栈区、堆区、全局/静态存储区、常量存储区、代码区。
局部变量:栈区
全局变量:全局/静态存储区
常量:常量储存区。const修饰的全局变量也储存在常量区,const修饰的局部变量依然在栈上。
malloc开辟的内存变量:堆区
C语言:内存分配

4.STL中Vector、List、Map底层实现
vector:底层实现是数组。连续存储的容器,动态数组,在堆上分配空间。
list:底层实现是双向链表。动态链表,在堆上分配空间。
map和set都是C++的关联容器,其底层实现都是红黑树。

5.智能指针相比普通指针的优势
智能指针使用了一种RAII(资源获取即初始化)的技术对普通的指针进行封装。
1)可以防止忘记释放。
2)异常安全。在一段进行了try/catch的代码段里面,即使你写入了delete,也有可能因为发生异常,程序进入catch块,从而忘记释放内存,这些都可以通过智能指针解决。
3)智能指针可以把指针的value语义转化为reference语义。
如何理解智能指针

6.select和epoll的区别
1)支持一个进程所能打开的最大连接数
select单个进程可监视的fd数量被限制,即能监听端口的大小有限。32位机默认是1024个。64位机默认是2048.
epoll虽然单个进程连接数有上限,但是很大。可以达到10W以上。
2)FD剧增后带来的IO效率问题
select因为每次调用时都会对连接进行线性遍历,所以随着FD的增加会造成遍历速度慢的“线性下降性能问题”。
因为epoll内核中实现是根据每个fd上的callback函数来实现的,只有活跃的socket才会主动调用callback,所以在活跃socket较少的情况下,使用epoll没有前面两者的线性下降的性能问题,但是所有socket都很活跃的情况下,可能会有性能问题。
3)消息传递方式
select内核需要将消息传递到用户空间,都需要内核拷贝动作。
epoll通过内核和用户空间共享一块内存来实现的。
4)select只支持LT(水平触发)。epoll既支持LT又支持ET(边缘触发),默认是LT。
select和epoll的区别

7.ET和LT模式的区别和可能的问题。
LT模式:在数据到达后,无论程序是没有接收,还是接收了但没有接收完,下一轮epoll_wait仍然会提醒应用程序该描述符上有数据,直到数据被接受完。(设置为阻塞和非阻塞都可以)
ET模式:在数据到达后,无论程序是没有接收,还是接收了但没有接收完,都只提醒一次,下一轮不再提醒应用程序该描述符上有数据。(只能设置为非阻塞)
为什么epoll的ET模式只能设置为非阻塞?
ET 模式是一种边沿触发模型,在它检测到有 I/O 事件时,通过 epoll_wait 调用会得到有事件通知的文件描述符,每于每一个被通知的文件描述符,如可读,则必须将该文件描述符一直读到空,让 errno 返回 EAGAIN 为止,否则下次的 epoll_wait 不会返回余下的数据,会丢掉事件。而如果你的文件描述符如果不是非阻塞的,那这个一直读或一直写势必会在最后一次阻塞。
LT模式与ET模式

8.单向链表中如何高效删除一个结点(只给定头指针和指向当前结点的指针)
因为没有当前传入节点的上一个节点,因此,需要想一个折中的办法,由于上一个节点知道它的下一个节点就是当前传入的节点,因此我们将当前节点中的所有信息换成当前节点的下一个节点的信息,也就变相的完成了节点的删除。
删除单向链表中的某个节点

9.给定n个正整数,如何找出最小的K个正整数
通过快排的思路解决

10.给定一组整数1000以内,如何高效去除重复的数
通过哈希映射的思路解决

11.main函数执行前后会执行什么代码
入口函数和初始化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章