腾讯提前批一面

面经:

Q:

i = 2;
int a = sizeof(i++);
cout << i << endl; i的是多少?

A:i的值不会加1。
Q: 谈下多态,C语言能不能进行函数重载?C++呢?
A:运行时多态:函数重载,模板。编译时多态:虚函数,虚函数表指针,虚函数。C语言不支持函数重载,C++里会在代码段记录函数的形参类型。
Q: C++有哪些存储类型描述符?mutable的作用?
A:auto, mutable, static, register, mutable。在 C++ 中,mutable 是为了突破 const 的限制而设置的。被 mutable 修饰的变量,将永远处于可变的状态,即使在一个 const 函数中,甚至结构体变量或者类对象为 const,其 mutable 成员也可以被修改。
Q: 了解哪些并发模型?
A:线程池,流水线模式
Q: map底层使用设呢么数据结构实现的?
A:unordered_map是哈希函数实现的,ordered_map是用红黑树实现的。
Q: 手动实现过红黑树吗?AVL有什么特点?
A: 没有,我对AVL比较熟。AVL每个节点的左子树节高度和右子树高度差不超过1。
Q:vector底层是如何实现的?
A:在堆上维护一段动态数组。
Q: tcp建立连接有几次握手,几次挥手?timewait的作用。
A:三次握手四次挥手。用说细节吗?(不用) timewait主要有两个作用:1、如果主动发起连接的一方收到FIN位为1的数据包后,向被关闭方发起ACK=1的数据包,如果这个包因网络堵塞等原因,被关闭防没有收到这个数据包,将无法关闭,造成CPU资源浪费。2、防止连接中因网络延迟而晚到达的数据使双发重新建立连接。
Q:tcp与udp的最主要的区别是什么?为什么QQ聊天要建立在UDP上,理论上聊天不应该保证可靠吗?
A:
Q:进程之间通信有哪些方式?
A:管道,命名管道,信号,socket套接字,共享内存,消息队列
Q:select和epoll的区别?
A:

1、在Linux内核中,select所用到的FD_SET是有限的,即内核中有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数,select只能最多监听1024个描述符,epoll对监听的描述符个数没有限制。
2、epoll在内核cache里建了个红黑树用于存储以后epoll_ctl传来的socket;而select是对文件描述符表进行轮询。
3、epoll建立一个list链表,用于存储准备就绪的事件;select只会返回准备就绪的事件的数量,需要在文件描述符表中查找。

Q: 单例设计模式,多线程下double check 能否保证有效?
A:double check在多线程情况下不能保证有效,因为编译器可能导致代码重排,假设并发时的一种使用场景:假设读写都只有一个线程,写线程中,数据写完时设置标志位。读线程中,通过对flag的判断来对数据进行使用。编译器进行处理时,data和flag并没有直接的关系(有用户自己指定的隐性关系,但是编译器并不知道),如果编译器进行非常激进的优化,在写线程中,先设置了flag,再写数据,或者在读线程中,将data作为一个不变量,提早进行读取,获取到的data值都是不正确的。因此,编译器进行的指令重排,会破坏用户代码中存在隐性关系的变量之间的控制流[2]。

因为有两个问题没答好,面完后找到了答案~
引用博客:
https://blog.csdn.net/jiange_zh/article/details/50811553
https://blog.csdn.net/MeRcy_PM/article/details/50496683

猜你喜欢

转载自blog.csdn.net/qq_38921322/article/details/81463376