电信面试

文章目录

他人面经

作者:折纸团团
链接:https://www.nowcoder.com/discuss/508829?type=all&order=time&pos=&page=1&channel=1009&source_id=search_all
来源:牛客网

1.const类对象怎么访问非const成员变量
const修饰的成员变量不能修改,在类内进行声明,在类的构造函数中进行初始化;
const修饰的成员函数只能读取数据成员不能修改数据成员,除非该成员变量有mutable修饰。
2.构造函数可不可以是虚函数,要不要把所有的析构函数都定义成虚函数
构造函数不能是虚函数,析构函数最好定义成虚函数,以防止内存泄漏。
构造函数不能定义成虚函数的原因:

  • 从使用上来看,构造函数是在实例化该类的对象的时候使用,虚函数调用的时候需要通过该对象所占内存的指向虚函数表的指针进行调用,但是在实例化对象的时候,该对象还未创建完成,还未申请好空间,所以不能将构造函数定义成虚函数
    析构函数如果不定义成虚函数,会造成内存泄漏:
  • 例如:有一个基类的指针指向派生类的对象,在调用析构函数时,由于析构函数不是虚函数,会调用基类的析构函数,那么只能释放该类所指向的对象的基类部分的成员所占的空间,派生类所特有的成员无法释放,当进行析构后,该块内存就无法释放,从而造成了内存泄露。

3.vector,list,map的区别,vector在push_back遇到内存不够怎么办

  • 从底层实现上来看,vector是一个动态数组,占用连续的内存空间;list是链表,在内存中所占用的空间不连续,通过指针将每一块内存空间连接起来,map的底层实现是红黑树。
  • 从使用上来看,vector适用于,在尾部插入元素,以及随机访问元素的情况,可以通过元素所在的下标直接访问元素,时间复杂度为O(1);list适用于在任意位置插入元素的i情况,查找的效率低于vector;map适用于元素要求有序存储的情况,底层的红黑树的存储结构,保证了保存元素的键有序排列

vector在push_back如果遇到了内存不够,会申请一块原空间两倍的内存空间,如果该内存依然不够,就会申请一块原空间+所需内存大小,将原空间的内容拷贝在新申请的空间,再插入待插入的元素,释放原空间的内存。这里是申请一块新的空间,并不是再原有空间的后面增加,因为无法保证原有空间所在的位置后面的空间足够。

4 mutable关键字
被mutable修饰的成员变量永远是可变的,即使是在类的const成员函数中,该变量也是可变的,或者该类的对象是cosnt,其内部的mutable成员变量也是可变的;
mutable只能修饰非静态数据成员

volatile不可对其进行执行期寄存于寄存器的优化(直接存取原始内存地址),编译器遇到这个关键字声明的变量就不会进行优化,从而提供对特殊地址的直接访问,
优化是指:一开始读取该变量,后来有一次读取该变量的值,发现在该期间该变量未进行修改,直接利用上一次读取的值,而不是重新读取,而有volatile修饰的变量,内次都要从其所在的寄存器中进行读取

5.大端小端字节序
存取0x2211,高位0x22,地位0x11
大段字节序:高位地址在前,低位字节在后,人类读写数值的方法0x2211
小段字节序:地位地址在前,高位地址灾后,0x1122

为什么会有小端字节序?
计算机在处理字节序的时候,计算机电路先处理低位字节,效率比较高,因为计算机都是从低位开始的,所以计算机内部都是小端字节序

但是人类习惯大端字节序,除了计算机内部处理,其他场合都是大端字节序

6 如何创建一个进程?如何区分子进程和父进程
7.后序d a b e c, 中序 d e b a c,求前序
8.linux系统的一些命令

问了socket编程,内存池怎么设计,双向队列,操作系统文件读取的过程
还有就是tcp的拥塞控制算法,对udp怎么改进,保证可靠性
TCP通信过程中socket函数的调用(越详细越好),讲完之后面试官还会细挖,

复盘

没问语言,问的网络和操作系统方面的知识偏多
1.五层模型分别有哪些协议
2.四次挥手
3.四次挥手过程为什么会等待2MSL
4.进程线程的区别
5.用户态和内核态的区别
6.什么是协程
7.本来说手撕代码,一看参加过编程比赛就没让写。。。。。

猜你喜欢

转载自blog.csdn.net/qq_31672701/article/details/108634903