秋招复习-C++, 一

Linux/Unix编程部分

1.进程间通信方式:信号,信号量,消息队列,共享内存,套接字Socket

2.ipcs: Linux/Unix下的命令,可以用来查看当前系统中所使用的进程间通信方式的各种信息,可以通过不同的参数选项来进行查询。

ipcs -a 是默认的输出信息 打印出当前系统中所有的进程间通信方式的信息

ipcs -m 打印出使用共享内存进行进程间通信的信息

ipcs -q 打印出使用消息队列进行进程间通信的信息

ipcs -s 打印出使用信号进行进程间通信的信息

3.ipcrm:Linux/Unix下的命令,可以用来移除进程间通信的载体,如共享内存段,信号集合和消息队列等,该命令只有root管理员和ipc的创建者才可以成功使用。该命令执行之后会将与载体相关的数据一起移除。

4.ELF文件:Unix/Linux系统下的一种标准文件格式,可以分为目标文件、可执行文件、共享库文件和核心转移文件四种不同的类型,主要由ELF头部、Program Header table、Section、Section Table组成,本质上是类Unix系统的标准二进制文件。

网络编程部分

1.connect发生阻塞,怎么解决?

答:方法一是设置定时器,使connect进行定时等待,一旦超时就返回错误,方法二是选择使用非阻塞模式,返回之后使用select判断此时所处的状态。

2.select判断数据可读,但是读回来的人数据长度为0,为什么?

答:某个套接字集合中没有准备好,可能会select内存用FD_CLR清该位为0

3.keepalive是什么?

答:TCP协议中用于检测死连接的一种机制。当建立TCP连接的双方长时间没有数据传输而处于空闲状态时,其中一方的主机会发出保持活动信号给另外一方,并等待应答。如果主机可达并且有回应,那么认为对方主机还在线,连接继续保持,反之,重复多次发现都没有报文返回,说明连接已经丢失,直接丢弃该连接。keepalive的探测报文发送间隔可以设置,具体可以参考这篇博客:https://blog.csdn.net/u010126059/article/details/50670801

算法部分

1.排序:常用的排序算法有多种,如快速排序、插入排序、基数排序等,各个算法都有自己的优点和缺点,时间复杂度和空间复杂度也不同,在选用排序算法时应该结合实际需求来选择合适的算法。

快速排序:平均时间复杂度为O(nlogn),最坏情况是O(n^2),当分割的元素选取不恰当时,就会出现最坏情况,此时左区间长度为0,右区间长度为n,一般采用三点中值算法进行优化。

插入排序:平均时间复杂度为O(n^2),适合小数据量或者数据接近有序的排序

C++ STL中实现了一个sort函数,用于对具有线性表结构的容器中的数据进行排序,可以用于对vector或者数据进行排序,不能用于对list和slist进行排序,其底层实现机制运用了以上所说的快速排序和插入排序,源码分析可以参考以下两篇博客:

https://blog.csdn.net/u010902721/article/details/45868391和https://blog.csdn.net/u010902721/article/details/45869367(感谢这位大神的分享,基本将sort的实现机制都说到了)

C++部分

1.值传递、指针传递和引用传递的区别

值传递是传递变量的值,将实参的值拷贝一份给形式参数,在函数中形参的改变与实参没有关系,因此在写swap的demo程序时输出结果并没有发生交换,因为形式参数相当于局部变量,其值存放在栈区域,函数执行完毕退出栈会被销毁。

引用传递和指针传递本质上都是传递地址,实参和形参都是同一变量的地址,在函数中对形参的操作是对该地址对应的内存进行操作,因此测试swap的demo输出结果会发生交换。

2.dynamic_cast

全称是动态类型转换,是C++提供的一种运行时多态类型转换的操作。dynamic_cast提供了类型安全检查,是一种基于能力查询(Capability Query)的转换,所以在多态类型间进行转换更提倡采用dynamic_cast。dynamic_cast只能用于多态类型的类型转换,被转换对象obj的类型T1必须是多态类型,即T1必须公有继承自其它类,或者T1拥有虚函数(继承或自定义)。若T1为非多态类型,使用dynamic_cast会报编译错误。

具体解析可以参考这篇博客:https://www.cnblogs.com/weidagang2046/archive/2010/04/10/1709226.html

暂且分享到这里,未完待续.............

2018-07-22 23:26:04 深圳