嵌入式八股(持续更新)
一、C++
1. inline和宏定义的区别:
- inline是一个关键字,是建议编译器直接将函数体插入到调用处,避免频繁调用函数造成的开销;inline只是建议,是否将函数内联需要编译器自己判断函数是否复杂等情况;一般用于频繁调用的简单函数;
- 宏定义:是预处理指令集,在编译前进行文本替换,不会进行类型检查;
2. malloc/free和new/delete的区别
malloc和new都用于动态内存管理,但是他们属于不同的机制;
- malloc/free:是C标准库函数,返回的是void*,需要强制类型转换;不会调用构造函数和析构函数;
- new/delete:是C++运算符,C++特有,自动返回正确类型的指针;自动调用构造函数和析构函数;
3. 空指针、野指针如何避免?
- 空指针是创建一个指针但是没有指向任何内容,是一个合法的操作;一般用于指针初始化;
- 野指针是指向的内容是不可预测或无效的;避免的话,首先就是指针指向的内存删除后,将指针删除或者nullptr;其次可以使用智能指针或者RAII方法;
4. struct和union的区别?
- struct和union都是结构体,允许将多个数据类型组合在一起;
- struct会为每一个对象都分配一个内存空间,允许一次使用多个对象;
- union所有对象共用同一块内存(内存总量即为最大对象的内存空间),每次只能使用一个对象;
5. 什么是工厂模式?
- 工厂模式就是将类的创建和使用分离,通过构造一个工厂抽象类,由该类来生产对象,用户只需要提供要使用的类型即可;
6. vector和list的底层逻辑
- vector是一个封装了动态数组的类,包含3个指针,分别指向头、要插入的位置指针以及最大内存指针;
- list的底层是双向链表,适合频繁的插入,但是不适合随机访问;
7. 动态链接/静态链接
- 静态链接时在编译的时候就将依赖库的代码一起编译进入最终的可执行文件中;可执行文件大;不依赖于外部的库文件;
- 动态链接是在程序运行的过程中才加载所需要的库代码,依赖共享库;可执行文件小,依赖外部库文件;
8. 函数重载和函数重写的区别?
- 函数重载就是在同一个作用域中定义函数名相同,但是输入输出参数不同的函数,这样我们在访问这些函数的时候只需要不同的输入参数即可区分;
- 函数重写就是实现多态时候用到的方法,基类中父函数必须为虚函数,子类中通过覆盖重写父函数;
9. 编译流程
- 预处理:对宏定义、头文件库以及预处理条件进行预处理(.i)
- 编译:将预处理后的代码编译为汇编语言(.s)
- 汇编:将汇编语言转为机器码(.o)
- 链接:将多个.o文件以及库文件链接到一起
10. 长连接、短链接?
- 短链接就是客户端与服务器进行通信,每次通信完成后都断开连接;
- 长连接是通信后不断开连接,只到一方主动断开;
11. vector的数据储存在栈上还是堆上?
- vector的元数据(指针、容量、指向堆内存的指针)储存在栈上、数组的具体元素储存在堆上
12. C++智能指针的了解?weak_ptr的用处?shared_ptr循环引用问题?
- C++智能指针就是创建的指针使其在生命周期结束后自动销毁的技术(RAII),避免内存泄漏;类别包括shared_ptr、unique_ptr以及weak_ptr;
- shared_ptr会出现循环引用的逻辑闭环错误,即两个对象都持有对方的shared_ptr指针,这样这两个指针永远也无法销毁;
- 解决办法就是一个使用shared_ptr(强引用),一个使用weak_ptr(弱引用);
13. linux调度策略?cfs?
- linux目前主要流行的调度策略为(CFS,Completely Fair Scheduler)完全公平调度器,用于普通非实时的进程;
- 原理:调度器会为每一个进行设置一个虚拟运行时间(vruntime),表示该进程已经运行的时间,调度器每次都会选择vruntime最小的进程来运行,来保证公平性;
14. 对上下文切换的理解?如何通过代码优化来减少频繁的上下文切换开销?
- 上下文切换是操作系统调度的基本机制,但在高并发场景中会造成明显性能损耗。我们可以通过减少线程数或线程池、降低锁竞争(避免频繁的阻塞)、使用协程、优化系统调用等方式来显著减少上下文切换带来的开销;
15. 对于linux内存管理的了解?对虚拟内存的了解?
- Linux 的内存管理机制是操作系统中最核心、最复杂的部分之一。它负责高效地分配、回收和保护进程使用的内存资源,同时提供虚拟内存、分页机制、缓存管理等功能;
- 虚拟内存是物理内存的映射,为了使进程看到的内存空间是连续的,其通过页表完成地址转换;
16. poll/select/epoll的区别?
- 效率方面:前两种每次都要轮询、epoll是通过事件驱动;
- 内核传递方面:前两种每次都需要复制用户态到内核态,epoll是通过mmap内存映射;
- 前两种不支持边缘触发、epoll支持
17. OSI七层模型?
- (物理层->链路层)->网络层->传输层->(会话层->表示层->应用层)
- TCP四层模型:网络接口层->网络层->传输层->应用层;
- 对应协议:物理层(以太网,MAC等);网络层(IP);传输层(TCP、UDP);应用层(HTTP、FTP等);
18. RS232、RS485的区别
- RS232是全双工,短距离传输,传输速率低(最高20kbps),单端信号;
- RS485支持半双工/全双工,适合长距离传输,传输速率高(最高10M),差分信号;
19. TCP三次握手、四次挥手
- 三次握手:客户端发送SNY=1,并发送初始序列号;服务端接收到以后,发送SNY=1以及ACK信号(ACK=SNY+1);客户端再次发送ACK信号;连接成功
- 四次挥手:客户端发送FIN=1,表示自己不再发送数据但是可以接收;服务端发送ACK信号作为应答;服务器再次发送FIN=1信号,表示自己不再发送数据;客户端发送ACK应答信号;连接关闭;