网易面经转载

作者:Vivid2332
链接:https://www.nowcoder.com/discuss/432793
来源:牛客网

  1. C++map的底层实现(红黑树)?为什么要用红黑树(讲了一下插入删除搜索的时间复杂度)?和hash表有什么区别,各自的优劣(hash表搜索插入删除操作都为常数时间复杂度)
    主要是用红黑树来存储有序的数据,它的查找、插入和删除操作的时间复杂度是O(lgn)。
    map:
    优点:
    有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作
    红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高
    缺点: 空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间
    适用处:对于那些有顺序要求的问题,用map会更高效一些

unordered_map:
优点: 因为内部实现了哈希表,因此其查找速度非常的快
缺点: 哈希表的建立比较耗费时间
适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map

  1. C++的多态(重载,重写)
    重载overload:在同一个类中,函数名相同,参数列表不同,编译器会根据这些函数的不同参数列表,将同名的函数名称做修饰,从而生成一些不同名称的预处理函数,未体现多态。
    重写override:也叫覆盖,子类重新定义父类中有相同名称相同参数的虚函数,主要是在继承关系中出现的,被重写的函数必须是virtual的,重写函数的访问修饰符可以不同,尽管virtual是private的,子类中重写函数改为public,protected也可以,体现了多态。

  2. 右值引用(提了一嘴转移语义,结果记得不清楚没说好,有点尴尬)

  3. C++编译过程中的动态链接和静态链接有什么区别?动态链接的流程是怎样的
    预处理—->编译—->汇编—->链接
    预处理:编译器将C程序的头文件编译进来,还有宏的替换
    编译:这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无错误后后,把代码翻译成汇编语言
    汇编:汇编语言变成机器语言
    链接:将编译阶段生成的文件连接为一个整体文

静态链接和动态链接的区别:静态链接和动态链接两者最大的区别就在于链接的时机不一样,静态链接是在形成可执行程序前,而动态链接的进行则是在程序执行时链接

  1. TCP/UDP的区别
    1) TCP提供面向连接的传输,通信前要先建立连接(三次握手机制); UDP提供无连接的传输,通信前不需要建立连接。
    2) TCP提供可靠的传输(有序,无差错,不丢失,不重复); UDP提供不可靠的传输。
    3) TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组; UDP是面向数据报的传输,没有分组开销。
    4) TCP提供拥塞控制和流量控制机制; UDP不提供拥塞控制和流量控制机制。

  2. TCP的拥塞控制
    1.慢开始
    2.拥塞控制
    3.快重传
    4.快恢复
    https://blog.csdn.net/qq_41431406/article/details/97926927

  3. 进程和线程的区别
    进程是资源分配的最小单位,线程是CPU调度的最小单位

  4. 进程间的通讯方式?线程间的通讯方式?
    进程间通信
      管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用进程间的亲缘关系通常是指父子进程关系。

  命名管道(named pipe/FIFO):命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

  信号量(semophonre):信号量是一个计数器,可以用来控制多个进程队共享资源的访问。它常作为一个锁机制,防止某进程在访问共享资源时,其他进程也访问此资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

  消息队列(message queue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  信号(sinal):信号是一种比较复杂的通信方式,用于通知接受进程某个事件已经发生。

  共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的ipc通信方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往和其他通信方式如信号量,配合使用来实现进程间的同步和通信。

  套接字(socket):套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同设备间的进程通信。

  全双工管道:共享内存、信号量、消息队列、管道和命名管道只适用于本地进程间通信,套接字和全双工管道可用于远程通信,因此可用于网络编程。

  

线程间通信
  锁机制:包括互斥锁、条件变量、读写锁

    互斥锁:提供了以排他方式防止数据结构被并发修改的方法。

    读写锁:允许多个线程同时共享数据,而对写操作是互斥的。

    条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

  信号量机制(Semaphore):包括无名进程信号量和命名线程信号量

  信号机制(Signal):类似进程间的信号处理

原文链接: https://www.cnblogs.com/pengfeij/p/13022633.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    网易面经转载

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/352321

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午7:27
下一篇 2023年3月2日 上午7:28

相关推荐