CVTE C++开发 33mins 一面凉经
项目
1、消息的数据结构
2、数据是定长的还是不定长的
3、文件是如何传输的
4、定点通信要怎么做
C++
1、C++11特性有哪些
2、C++智能指针,底层实现
3、C++多态说一下
4、一个空类多少字节?加一个函数呢?加一个虚函数呢?
5、构造函数可以调用虚函数吗
6、析构函数可以是虚函数吗,不是虚函数会怎么样?
7、final关键字的作用
8、重载函数如何实现
Qt
1、讲一下元对象QObject
2、connect()包含哪些参数
3、有几种connect方式
计网
1、TCP如何保证可靠
2、TCP粘包问题和解决办法
2、ARP协议
3、讲一下keepalive
OS
1、进程通信的方式
2、共享内存实现原理
3、互斥锁底层实现
4、IO同步,IO异步
答案整理
C++
1、C++11特性有哪些
1)关键字:auto 关键字、nullptr代替NULL、for循环语法
2)array、forward_list、unordered_map、unordered_set
3) thread、atomic、condition_var
4)新智能指针unique_ptr、share_ptr、weak_ptr
5)function、bind、lambda
2、C++智能指针,底层实现
1) auto_ptr——自动回收内存资源
2)unique_ptr——限制一个指针指向一个内存
3)share_ptr——实现多个指针指向一个内存
4)weak_ptr——解决share_ptr循环引用的死锁问题
3、C++多态说一下
静态多态——函数模板和函数重载
动态多态——子类代码重写,基类指针指向不同子类相同函数实现不同的动作
4、一个空类多少字节?加一个函数呢?加一个虚函数呢?
空类占1字节,加一个函数还是1字节,加一个虚函数变为4字节
5、构造函数可以调用虚函数吗
可以
6、析构函数可以是虚函数吗,不是虚函数会怎么样?
析构函数可以是虚函数
类作为基类时析构函数必须为虚函数,否则会造成内存泄漏
类不被继承时析构函数不必设为虚函数,因为虚函数会消耗一定的内存资源
7、final关键字的作用
修饰类,表示该类不允许继承
修饰虚函数,表示该虚函数不允许重写
8、重载函数如何实现
重载函数表示,函数具有相同的函数名,参数不同
编译阶段,编译器根据参数的不同将相同函数名的函数编译成不同的函数名
运行阶段,就可以根据不同的函数名对重载函数进行调用
Qt
1、 讲一下元对象QObject
Qt中绝大多数的对象都是基于Qobject实现的
Meta Object Compiler元对象编译器,实现了元对象机制,增加了C++新特性
信号槽机制、复杂的定时器、层次化的对象树、智能指针等…
2、 connect()包含哪些参数
自定义对象/系统对象,信号函数,自定义对象/系统对象,槽函数,连接类型
3、 有几种connect类型
1)Qt::Autoconnection——自动解析连接类型
2)Qt::DirectConnection——发送者与接收者在同一个线程
3)Qt::QueuedConnection——发送者与接收者在同一个线程
4)Qt::BlockingQueuedConnection——发送者发送信号后进入阻塞状态,直到槽函数运行完
5)Qt::UniqueConnection——避免重复连接
计网
1、 TCP如何保证可靠
拥塞控制——保证网络不瘫痪——慢开始,拥塞避免,拥塞调整,快重传
流量控制——保证客户端与服务器的收发信息同步
确认机制——保证发出去的数据被完整地接收,通过序号化数据实现
超时重传——连续三次收到丢包,重传数据
验证和——对数据二进制求和取反,保证数据的完整性
2、 TCP粘包问题和解决办法
粘包原因
1)TCP协议基于流式传输,在缓存区会有多个TCP包
2)发送端等待缓存区满才发送数据
3)接收端等待缓存区满才读数据
4)TCP协议会将几个较小的包合并成一个进行发送
解决办法
1)发送定长包
2)包与包之间加边界符
3)给每个包指明长度
4)使用更复杂的应用层协议
3、 ARP协议
本地网络寻址:将主机B名转IP,在缓存找有没有对应的MAC,无则通过主机A的子网掩码判断是否属于同个子网,是则进行广播,主机B收到ARP广播对比自己的MAC,相同进行回应,主机A将主机B的MAC写入缓存,进行数据链路层的封装,发送数据。
非本地网络寻址:将主机B名转IP,在缓存找有没有对应的MAC,无则通过主机A的子网掩码判断是否属于同个子网,否则将数据包发送给自己的缺省网关,跳转到下一个路由器,路由器通过路由表决定将数据包从哪个接口发送。
4、 讲一下keepalive
TCP的keepalive意图保存客户端和服务器的连接,一方会不定期发送心跳包给另一方,当一方断开连接,没断开连接定时发送几次心跳包,如何连续收到断开方的RST,而不是ACK则断开连接。如果TCP没有keepalive机制,自动断开,没断开的会一直以为当前连接是存活的,这对服务器的连接资源影响会很大。
HTTP的keep-alive意图在短时间内连接复用,希望可以短时间内同一个连接上进行多次请求与响应。当客户端与服务器连接上后,传输完一次数据不会马上断开连接,而是让后面传输数据依旧走这一条TCP连接。
OS
1、 进程通信的方式
管道、信号量、信号、共享内存、消息队列、套接字
2、 共享内存实现原理
两个进程的地址空间为同一个物理空间,两个进程可以同时对内存进行读写访问。但由于共享内存本身未实现同步机制,需要自己配合信号量使用。
1)Ipcs -m 查看系统中的共享存储区
2)Ipcre -m[shmid] 删除系统中的共享存储段
3)int shmget(key_t key,size_t size,int shmflg) 创建共享内存
Key为IPC资源表示,size为申请共享内存的大小,shmflg创建模式
4)void *shmat(int shmid,const void *shmaddr,int shmflg) 挂接共享内存
Shmid为共享内存标识符,shmaddr为指定共享内存地址,shmflg读写挂接
5)Int shmdt(const void *shmaddr)去关联共享内存
Shmaddr为共享内存地址
6)Int Shmctl(int shmid,int cmd, struct shmid_ds *buf)销毁共享内存
Shmid为共享内存标识,cmd设为IPC_RMID可以删除共享内存,buf置NULL
3、互斥锁底层实现
通过一个标志位,进行原子分配,用时置0,释放置1
4、 linux的IO模式,同步异步的区别,阻塞与非阻塞的区别
阻塞IO:等待数据准备完毕,不干别的事就等待
非阻塞IO:等待数据准备完毕前 会返回进程干别的事
多路复用IO:内核通过select/epoll/poll 检测是否有准备好的数据 有则唤醒进程
信号驱动IO:进程通过sigaction注册信号函数,数据准备好内核发送信号
异步IO:进程通过aio_read,实现内核准备好数据并完成复制后再告诉进程