C/C++面试八股 面试真题加积累八股
这里我总结一下我的嵌入式的八股文积累,体量比较大,基本都是我秋招面试来遇到的面试真题,什么题都有
主要是偏C/C++嵌入式这一块,希望能帮到各位小伙伴和后来的人,希望大家送送花点点赞
这个系列大概分为好几期吧,尽快肝出来,大家只要面试前抽个一个小时每次背背,基本上八股部分不会有太大问题
我都放在我主页置顶希望小伙伴们捧捧场
千万别只点收藏哦
urat:
两根线
无时钟
异步
全双工
i2c:
两根线
时钟和数据
同步
半双工
可以多主机多从机
传输速率100K,400K和3.4M三种速率(bps)
SCL和SDA:SCL高电平期间SDA有高变低为起始信号;
SCL高电平期间SDA由低变高为终止信号;
SCL高电平期间SDC低位0,高为1;
iic采用7bit寻址字节,1-7表示从机地址,0位表示传输方向;表示读写
每一个字节必须保证是8bit长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随1bit的应答位,每一帧数据有九位
通行流程:
1. 启动信号:主设备发送起始信号,通过拉低SDA线,同时SCL线保持高电平。
2. 地址发送:主设备发送目标从设备的地址及读/写位。地址后,目标从设备应应答。
3. 数据传输:主设备或从设备根据读/写位进行数据传输。每传输一字节后,接收方应发应答位。
4. 停止信号:完成数据传输后,主设备发送停止信号,释放SDA线,SCL线保持高电平。
- ACK:表示“我已收到,继续发送”。
- NACK:表示“我未收到或我已完成,不要再发送了”。
spi:
四线制或者三线制
时钟 、ss、miso、mosi
同步
全双工
有发必有会回
spi传输速率 :可以达到50Mbps
一主多从
计算数组长度:
通过sizeof(),数组长度除以数组第一个元素的长度
c通过strlen()函数, c++通过.size()
数组和链表的区别:
数组和链表是两种不同的**数据存储**方式
数组是一组具有相同数据类型的变量集合
链表是一个中物理存储单元上不连续的存储结构,各个元素的逻辑顺序通过链表中的指针链接实现
数组:(1)数组在内存中连续; (2)使用数组之前,必须事先固定数组长度,不支持动态改变数组大小;(3) 数组元素增加时,有可能会数组越界;(4) 数组元素减少时,会造成内存浪费;(5)数组增删时需要移动其它元素。数组从栈上分配内存,使用方便,但是自由度小。数组在内存中顺序存储,可通过下标访问,访问效率高。数组的大小是固定的,所以存在访问越界的风险。数组的存储空间是栈上分配的,存储密度大,当要求存储的大小变化不大时,且可以事先确定大小,宜采用数组存储数据。数组的存储空间是栈上分配的,存储密度大,当要求存储的大小变化不大时,且可以事先确定大小,宜采用数组存储数据。
链表:(1)链表采用动态内存分配的方式,在内存中不连续 (2)支持动态增加或者删除元素 (3)需要时可以使用malloc或者new来申请内存,不用时使用free或者delete来释放内存。链表从堆上分配内存,自由度大,但是要注意内存泄漏。链表从堆上分配内存,自由度大,但是要注意内存泄漏。链表访问效率低,如果想要访问某个元素,需要从头遍历。只要可以申请得到链表空间,链表就无越界风险。链表的存储空间是堆上动态申请的,当要求存储的长度变化较大时,且事先无法估量数据规模,宜采用链表存储。链表插入、删除效率高,当线性表要求频繁插入和删除时,宜采用链表结构。
vector和list的区别+应用:
Vector:
连续存储的容器,动态数组,在堆上分配空间
底层实现:数组
性能:
适用场景:经常随机访问,且不经常对非尾节点进行插入删除,因为尾节点插入涉及空间问题
List:
动态链表,在堆上分配空间,每插入一个元数都会分配空间,每删除一个元素都会释放空间。
底层:双向链表
性能:
访问:随机访问性能很差,只能快速访问头尾节点
插入:很快
删除:很快
vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随即访问,而不在乎插入和删除的效率,使用vector。
list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用list。
进程和线程的区别:
进程:
一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程
进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段
也因为进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响
线程:
进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。
线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以(IPC)进行。
线程只是一个进程中的不同执行路径。一个线程死掉就等于整个进程死掉。
在通信机制上:
进程的通信机制**相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便
线程通信主要可以分为三种方式,分别为共享内存、消息传递和管道流
1.管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。(同步互斥机制)
2.命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据:管道一端的进程顺序地将进程数据写入缓冲区,另一端的进程则顺序地读取数据,该缓冲区可以看做一个循环队列
3.消息队列MessageQueue:消息队列就是一个消息的链表,是一系列保存在内核中消息的列表。用户进程可以向消息队列添加消息,也可以向消息队列读取消息。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4.共享内存SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,共享内存允许两个或多个进程共享一个给定的存储区。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
5.信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
6.套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。基于网路型,基于文件型
7.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
主要是偏C/C++嵌入式这一块,希望能帮到各位小伙伴和后来的人,希望大家送送花点点赞
这个系列大概分为好几期吧,尽快肝出来,大家只要面试前抽个一个小时每次背背,基本上八股部分不会有太大问题
我都放在我主页置顶希望小伙伴们捧捧场
千万别只点收藏哦
urat:
两根线
无时钟
异步
全双工
i2c:
两根线
时钟和数据
同步
半双工
可以多主机多从机
传输速率100K,400K和3.4M三种速率(bps)
SCL和SDA:SCL高电平期间SDA有高变低为起始信号;
SCL高电平期间SDA由低变高为终止信号;
SCL高电平期间SDC低位0,高为1;
iic采用7bit寻址字节,1-7表示从机地址,0位表示传输方向;表示读写
每一个字节必须保证是8bit长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随1bit的应答位,每一帧数据有九位
通行流程:
1. 启动信号:主设备发送起始信号,通过拉低SDA线,同时SCL线保持高电平。
2. 地址发送:主设备发送目标从设备的地址及读/写位。地址后,目标从设备应应答。
3. 数据传输:主设备或从设备根据读/写位进行数据传输。每传输一字节后,接收方应发应答位。
4. 停止信号:完成数据传输后,主设备发送停止信号,释放SDA线,SCL线保持高电平。
- ACK:表示“我已收到,继续发送”。
- NACK:表示“我未收到或我已完成,不要再发送了”。
spi:
四线制或者三线制
时钟 、ss、miso、mosi
同步
全双工
有发必有会回
spi传输速率 :可以达到50Mbps
一主多从
计算数组长度:
通过sizeof(),数组长度除以数组第一个元素的长度
c通过strlen()函数, c++通过.size()
数组和链表的区别:
数组和链表是两种不同的**数据存储**方式
数组是一组具有相同数据类型的变量集合
链表是一个中物理存储单元上不连续的存储结构,各个元素的逻辑顺序通过链表中的指针链接实现
数组:(1)数组在内存中连续; (2)使用数组之前,必须事先固定数组长度,不支持动态改变数组大小;(3) 数组元素增加时,有可能会数组越界;(4) 数组元素减少时,会造成内存浪费;(5)数组增删时需要移动其它元素。数组从栈上分配内存,使用方便,但是自由度小。数组在内存中顺序存储,可通过下标访问,访问效率高。数组的大小是固定的,所以存在访问越界的风险。数组的存储空间是栈上分配的,存储密度大,当要求存储的大小变化不大时,且可以事先确定大小,宜采用数组存储数据。数组的存储空间是栈上分配的,存储密度大,当要求存储的大小变化不大时,且可以事先确定大小,宜采用数组存储数据。
链表:(1)链表采用动态内存分配的方式,在内存中不连续 (2)支持动态增加或者删除元素 (3)需要时可以使用malloc或者new来申请内存,不用时使用free或者delete来释放内存。链表从堆上分配内存,自由度大,但是要注意内存泄漏。链表从堆上分配内存,自由度大,但是要注意内存泄漏。链表访问效率低,如果想要访问某个元素,需要从头遍历。只要可以申请得到链表空间,链表就无越界风险。链表的存储空间是堆上动态申请的,当要求存储的长度变化较大时,且事先无法估量数据规模,宜采用链表存储。链表插入、删除效率高,当线性表要求频繁插入和删除时,宜采用链表结构。
vector和list的区别+应用:
Vector:
连续存储的容器,动态数组,在堆上分配空间
底层实现:数组
性能:
适用场景:经常随机访问,且不经常对非尾节点进行插入删除,因为尾节点插入涉及空间问题
List:
动态链表,在堆上分配空间,每插入一个元数都会分配空间,每删除一个元素都会释放空间。
底层:双向链表
性能:
访问:随机访问性能很差,只能快速访问头尾节点
插入:很快
删除:很快
vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随即访问,而不在乎插入和删除的效率,使用vector。
list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用list。
进程和线程的区别:
进程:
一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程
进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段
也因为进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响
线程:
进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。
线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以(IPC)进行。
线程只是一个进程中的不同执行路径。一个线程死掉就等于整个进程死掉。
在通信机制上:
进程的通信机制**相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便
线程通信主要可以分为三种方式,分别为共享内存、消息传递和管道流
1.管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。(同步互斥机制)
2.命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区存取数据:管道一端的进程顺序地将进程数据写入缓冲区,另一端的进程则顺序地读取数据,该缓冲区可以看做一个循环队列
3.消息队列MessageQueue:消息队列就是一个消息的链表,是一系列保存在内核中消息的列表。用户进程可以向消息队列添加消息,也可以向消息队列读取消息。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4.共享内存SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,共享内存允许两个或多个进程共享一个给定的存储区。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
5.信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
6.套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。基于网路型,基于文件型
7.信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
全部评论
相关推荐
菜狗二号:写的真好
点赞 评论 收藏
分享