阿里云日常实习一面
面试时间:2023/1/9
【来自同学的面试记录】
- 自我介绍
- 介绍项目
- 进程的组成
- 进程和线程的区别
- 构造函数、析构函数、拷贝构造函数等函数的作用
- 父类的析构函数为什么要申明为虚函数
- 代码题:手撸LRU
- 反问环节
大佬同学对每一个问题回答的都比较细致、而不是在背八股,所以问题个数就比较少。
大佬的面试就是稳啊,面试过程中面试官也啧啧称赞~
2023/2/10
记录一下几个问题的答案
进程的组成:
进程就是运行起来的程序的抽象
进程由程序控制块(PCB)、程序段、数据段组成
操作系统通过PCB来管理进程,因此PCB中存放操作系统对进程管理的各种信息,如进程描述信息,进程控制和管理信息,资源分配清单相关信息等。
程序段:程序代码存放的位置
数据段:程序运行时使用,产生的运算数据。如全局变量,局部变量,宏定义的常量就存放在数据段内
进程和线程的区别:
1)进程是资源分配的基本单位(包括内存,打开的文件),线程是CPU调度的基本单位
2)线程和进程相似,同样具有三种基本状态:就绪、阻塞、运行,同样具有状态之间的转换关系
3)线程能减少并发执行的时间和空间开销,具体体现在:
线程创建时间比进程快:进程创建需要大量的资源管理信息,如内存管理,文件管理,而线程不需要关心,因为线程共享这些信息
线程终止时间比进程快:线程释放的资源比进程少
线程切换更快:线程有相同地址空间,不需要切换表
线程数据传递不需要经过内核,因为线程之间共享资源
构造函数、析构函数、拷贝构造函数等函数的作用
构造函数:
构造函数在创建一个对象时,系统自动调用。如果用户没有自定义构造函数,系统会调用默认构造函数,默认构造函数会将所有歌数据成员初始化为0或者空。
构造函数都是没有返回值的。
析构函数:
析构函数没有返回值,也没有参数。一个类中只能定义一个析构函数,如果没有,系统会自动调用默认析构函数
析构函数调用条件:1)在一个函数中定义一个对象,当函数调用结束,则会自动调用析构函数来删除在这个函数体内创建的对象。包括主函数。2)用new运算符动态构建的对象,在使用delete运算符释放它时
析构函数为什么定义为虚函数?
析构函数定义成虚函数是为了防止内存泄漏,因为当基类的指针或者引用指向或绑定到派生类的对象时,如果未将基类的析构函数定义成虚函数,只会调用基类的析构函数,那么只能将基类的成员所占的空间释放掉,派生类中特有的就会无法释放内存空间导致内存泄漏。
我们将析构函数定义为虚函数,在执行析构时,则根据对象的类型来执行析构函数,此时派生类的资源得到释放。
拷贝构造函数:
拷贝构造函数实际上也是构造函数,具有一般构造函数的所有特性,其名字也与所属类名相同。拷贝构造函数中只有一个参数,这个参数是对某个同类对象的引用。
拷贝构造函数的目的是用一个已有的对象创建一个新的对象
代码题:手撸LRU
#我的实习求职记录#