面试问题总结
c/c++
封装、继承和多态
- 封装:将属性和方法封装起来,并加以权限区分。
- 继承:子类继承父类的特征和行为,复用了从基类复制而来的数据成员 和成员函数 (基类私有成员无法被访问),其中构造函数、析构函数、友元函数、静态数据成员、静态成员函数都不能被继承,提高了代码的复用率。(虚继承解决菱形继承问题)。
- 多态:同一种类型的对象在不同的情况下表现出不同的行为。简单来说,就是同一个方法在不同的对象上可以有不同的实现。
1G内存这个可以malloc
1.2G空间?为什么?
malloc
能够申请的空间大小与物理内存的大小没有直接关系,仅与程序的虚拟地址空间相关。程序运行时,堆空间只是程序向操作系统申请划出来的一大块虚拟地址空间 。应用程序通过malloc
申请空间,得到的是在虚拟地址空间中的地址,之后程序运行所提供的物理内存是由操作系统完成的。
单例模式
单例模式 (Singleton) : 保证一个类只有一个实例(懒汉式,饿汉式)。
类模板和函数模板
在c++17
之前类模板 支持自动类型推导,函数模板不支持自动类型推导。
自动类型转换和自动类型推导
- 自动类型转换 :在某些情况下,编译器会自动将一个类型转换为另一个类型。这种转换也称为隐式类型转换。
- 数值类型之间的隐式类型转换。
- 派生类指针和基类指针之间的隐式类型转换。
- 用户自定义类型(类单个参数的构造函数)。
- 自动类型推导:自动类型推导是指编译器根据表达式的上下文来推断变量的类型。
虚析构和纯虚析构
关键字virtual
,纯虚析构函数必须要提供函数体,纯虚析构会使基类是抽象类,不能实例化对象。
缺省参数
缺省参数是指在定义函数时给某个参数设置一个默认值,当函数被调用时,如果没有传递该参数,就会使用默认值。调用时只能从最后一个参数开始进行省略,换句话说,如果你要省略一个参数,你必须省略它后面所有的参数。
sizeof
和 strlen
的区别
sizeof
是一个操作符,strlen
是库函数。sizeof
的参数可以是数据的类型,也可以是变量,而strlen
只能以结尾为'\0'
的字符串作参数。- 如果
strlen
函数调用的字符串没有以'\0'
结尾,那么该函数的行为是未定义的。
- 如果
- 编译器在编译时就计算出了
sizeof
的结果。而strlen
函数必须在运行时才能计算出来。并且sizeof
计算的是数据类型占内存的大小,而strlen
计算的是字符串实际的长度。 - 数组做
sizeof
的参数不退化,传递给strlen
就退化为指针了。- 对于一个空的类,里面没有任何成员和变量和函数,对该类的实例求
sizeof
得到的结果是1
,本来应该是0
,但是必须在内存中占有一定空间,至于占多少内存由编译器决定,大部分都是1
。 - 如果在类中添加构造函数和析构函数仍然是
1
。 - 如果把析构函数标记为虚函数,就会在实例中添加一个指向虚函数表的指针,所以大小是
4
或者8
。
- 对于一个空的类,里面没有任何成员和变量和函数,对该类的实例求
gcc
编译过程
- 预处理:头文件包含、宏替换、条件编译、删除注释。
- 编译:词法、语法、语义分析,检查无误后编译成汇编文件。
- 汇编:将汇编文件转换成二进制目标文件。
- 链接:将各个二进制文件+库文件+启动代码链接成可执行文件。
逻辑短路
执行逻辑运算时,如果能够确定整个表达式的结果,就不再继续计算表达式的其余部分。
- 逻辑与 (
&&
) 的短路 :当使用&&
运算符时,如果第一个操作数为假(false
),则整个表达式的结果已经确定为假,因此不会计算第二个操作数。 - 逻辑或 (
||
) 的短路 :当使用||
运算符时,如果第一个操作数为真(true
),则整个表达式的结果已经确定为真,因此不会计算第二个操作数。
好处:
- 避免不必要的计算 :如果表达式的结果已经确定,就不需要执行后续的计算,这可以提高程序的效率。
- 防止潜在的错误 :例如,在数组索引检查中,如果第一个条件已经满足,就不需要执行可能引发越界的第二个条件检查。
- 简化代码逻辑 :有时候可以利用逻辑短路来简化复杂的条件判断。
单片机
UART
、IIC
和SPI
通信协议
串口协议 :串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方 式的扩展接口。串行接口(Serial Interface
)是指数据一位一位地顺序传送。其特点是通信线路简 单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成 本,特别适用于远距离通信,但传送速度较慢。
- 是设备间接线通信的一种方式。
- 数据一位一位地顺序传送。
- 双向通信,全双工(两条线,一条发送数据(
TX
),一条接收数据(RX
))。 - 传送速度相对较慢。
IIC
协议 :集成电路总线;是由PHILIPS
公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC
属于半双工同步通信方式(只有一根双向的数据线SDA
)。
-
简单性和有效性:由于接口直接在组件之上,因此
IIC
总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。 -
多主控(
multimastering
):任何能够进行发送和接收的设备都可以成为主总线。 -
IIC
串行总线一般有两根信号线,一根是双向的数据线SDA
,另一根是时钟线SCL
,其时钟信号是由主控 器件产生。
SPI
协议:串行外设接口;是一种高速的,全双工,同步的通信总线。
MISO
--Master Input Slave Output
,主设备数据输入,从设备数据输出。MOSI
--Master Output Slave Input
,主设备数据输出,从设备数据输入。SCK
--Serial Clock
,时钟信号,由主 设备产生。CS
--Chip Select
,片选信号,由主设备控制。
网络编程
arp
欺骗
发送真实的目的ip
和目的mac
但源ip
和源mac
是假的arp
应答包。
字节序
字节序是多字节数据在内存中的存放顺序,大端(高字节放在低地址);小端(低字节放在低地址)。
系统编程
上下文
上下文信息是CPU
执行程序时所需的状态信息集合,包括寄存器状态、程序计数器、堆栈信息等,它允许操作系统管理进程切换、中断处理和系统调用。
上下文切换是操作系统在不同进程或任务之间保存和加载这些状态信息的过程,尽管它对系统性能有影响,但对于多任务处理和响应中断是必不可少的。