1.自我介绍
2.对客户端工具的理解
了解不是很多,感觉没说到点上,以后面试之前要具体了解一下岗位
3.指针和引用的区别
从几个方面来说
指针可以不初始化,但是引用需要绑定存在的对象
指针是可以为空的,引用时不能为空的
引用不占用空间内存,指针占用空间且为四字节或八字节
根本的区别上是使用安全上
在一个作用域外定义了一个指针,再作用域内实例化一个对象,指针指向这个对象,然后出作用域时这个对象析构销毁,然后出作用域外调用指针会出现未定义行为,而引用的生命周期是与对象绑定的,所以不会出现这样的问题
(指针可变,引用不可变还有多级忘记说了)
4.static的用法
用在全局变量上的话,就会给这个变量添加了一个文件作用域,这个变量就只对这个文件可见
添加在成员函数和成员变量的话,会使这个函数和成员变量脱离这个类存在,就不能再初始化了,必须再类外初始化(这里我应该说脱离类实例存在,不用先创建实例,再使用),用在普通函数里,初始化之后,每次增加不会重新增加他,他就不会再变了(这里我说错了,没想好就说了,因为说初始化之后就会一直存在知道程序结束,且只会进行以此初始化)
5.内联函数
没说清楚,基本没说出来
6.内存的分配方式有哪几种
new delete malloc free 没想到没说出来
7.析构函数声明为虚函数的作用是什么
从派生类虚析构函数可以一直调用到基类虚析构函数
8.如何实现智能指针
对象的销毁和控制块分离
9.如何保证引用计数
没说出来(应该说RAII?)
10.如何复制智能指针对象
没说出来
11.字典的实现方式
一下子想不起来,我就直接说我没深入了解,但是我自己觉得应该会是用哈希来实现
12.开放地址冲突如何解决
问了一下是不是指哈希冲突,然后我说用链表和桶来解决
13.数组和链表的区别
数组在物理和逻辑地址都是连续的,链表在逻辑上连续但是在物理地址上是不连续的,是多个不连续的内存地址通过指针联系在一起(应该说的更多的,比如扩容的时候,插入的空间复杂度之类的)
14.BFS和DFS的区别
深度优先的话主要是判断路径是否存在,广度优先的话就是在判断路径是否存在的基础上结合路径权重等因素得到最优路径
15.unity 和 ai
都没什么了解
16.实习
只是跑流程
17.项目:如何缓解gc,降低gc频率
下意识以为说是gc工作线程怎么保持不频繁的销毁和创建,然后说了版本号迭代加条件变量阻塞,后面复盘听的发现完全想错了。。。。
18.写个快排
19.const 变量有哪些用法
修饰的变量是不能改变重新赋值的,用在函数的返回值部分就是返回值是const常量值,用在函数名后的话说明函数里是不能对修改变量的,参数前的话就是传入的是产量(反正感觉说的不好)
20.什么是野指针
就是没有被初始化过的指针
21.面向对象的三大特征
继承 多态 封装
22.多态的实现有哪些
静态的有模板 动态的是虚函数
23.vector迭代器会失效是为什么
比如说进行扩容的话,vector可能会移动到新的地址去,导致原先的迭代器会失效(迭代器没深入了解过)
24.怎么检查内存泄漏
用new申请的地址,是否被delete释放销毁
25.什么是内存碎块
反正就是说一整块地址被不连续的申请内存,中间留下来的没有被申请的小块地址
26.进程线程的区别
linux中两者根本上来说都是一个数据结构,最大的区别在于进程有独立的资源和空间,而线程大部分是共享的资源和空间
27.项目中最难的bug
gc,窃取队列的实现