C++面试突击(3)
1、宏定义和常量const有什么区别?宏有什么优缺点?
分析:宏是预处理期的文本替换,const是编译期的类型安全的常量。宏是没有类型检查的,const有;宏的优点是零开销,适合用于嵌入式开发场景,其次它灵活性好,可以用#和##实现字符串拼接或代码生成;它的缺点是不安全,不好调试。
2、Linux驱动分为几类?
分析:这个问题考察对Linux驱动模型的理解是否成体系。linux驱动主要分为三大类,一是字符设备驱动,二是块设备驱动,三是网络设备驱动。字符设备的特点是以字节流的形式进行顺序读取,典型例子是键盘鼠标、串口、LED、传感器等。块设备是以数据块为单位进行读写,如硬盘、U盘和SD卡等。网络设备是面向数据包的,不像前两种那样对应于设备文件。典型例子是以太网卡、wifi模块等。再补充一下常见的字符设备开发流程:首先肯定是先申请设备号、然后创建并注册设备、接着实现并关联文件操作集,最后在用户空间通过设备文件进行测试。
3、内核是什么?
分析:这个问题其实考察你是否理解操作系统的核心。内核是操作系统的核心部分,相当于计算机系统的指挥官,它负责四件最重要的事情:一是进程管理,负责创建线程、调度、销毁进程和线程;二是内存管理,为每个进程分配独立的虚拟内存空间,管理物理内存和虚拟内存的映射;三是设备管理,为硬件设备提供抽象接口;四是文件系统管理,管理存储在磁盘上的数据。
4、进程和线程的区别?
分析:这个问题也是和操作系统有关的。进程相当于“正在进行的程序”,系统会分配独立的内存空间。线程是进程里的一个执行流,一个进程可以包含多个线程,线程是可以共享进程的所有资源的,同时每个线程也有自己独立的栈和寄存器状态。
5、RS485和IIC的区别?
分析:考察协议的基础。先定性描述一下,RS485是一种设备级的通信协议,适合设备间的长距离通信;IIC是一种板级的通信协议,常用于电路板内部芯片之间的短距离通信。IIC是有时钟线的,是同步的;RS485没有时钟线,是异步的,通过约定波特率来通信。
6、IO的状态?
分析:这个是考察硬件基础。IO是输入输出的意思,那就是关注输入和输出的状态。先说输出,我们常见的有开漏输出和推挽输出,开漏输出可以有力的输出低电平,传输高电平的时候要外接上拉电阻才可以得到高电平。推挽输出最常用,可以有力的输出高电平或低电平,驱动能力很强。输入就是上拉或者下拉输入了,上拉就是外部无信号时引脚默认高电平,下拉就是外部无信号时引脚默认低电平。
7、多态是什么,怎么实现的?
分析:这个是C++的经典面试题。多态就是多种形态,允许不同类的对象对同一个消息做出不同的响应,具体的说,就是使用父类的指针或引用来调用一个方法,实际执行的子类重写后的方法。比如一个父类“Animal”,有一个speak()方法。这时候有子类“猫”和“狗”,调用Animal.猫,就会打印“喵喵”,如果调用Animal.狗,就会打印“汪汪”,这就是多态的一个意思。多态的实现主要是通过“动态绑定”和“虚函数表”实现的,动态绑定是说在调用方法的时候,其实不是调用父类的方法,而是调用了子类的方法,虚函数表也是类似这个意思。
8、内存分配的方法?
分析:考察操作系统的问题。因为内存也是有布局的,所以内存分配的方法也不同。常见的方法有静态分配、自动分配和动态分配。像全局变量、静态变量这些就是静态分配的内存;像局部变量这些就是由编译器自动分配的内存,也会自动回收;有些变量是动态变化的,就通过手动动态分配,分配的区域是堆,也要手动释放,避免内存泄漏的问题。
9、new和malloc的区别?
分析:考察内存管问题。malloc是C语言的动态内存分配方法,new是C++的动态内存分配方法,它不仅分配内存,还会调用构造函数,相当于初始化对象。