C/C++
关键字
C 语言中变量的完整定义
(a)sizeof 和strlen
(1)sizeof是运算符,计算变量或数据类型占用的字节数,在编译时计算(内存大小)
(2)strlen是函数,计算字符串的长度,在运行期计算(长度)
(3)sizeof 可以是类型函数做参数,而strlen只能是char *,且以/0结尾
(4)字符串里面,sizeof 计算的是长度+ /0,stelen是真实长度
(b)volatile
防止被编译器优化,让编译器不再去优化被volatile修饰的变量的操作,每次读取该变量的值都重新从内存中读取而非从寄存器中。
场景:
(1)硬件寄存器,状态寄存器等,因为每次对它的读取可能是不同意义。
(2)多线程或者并发编程中,多个线程访问一个变量并且进行操作,需要确保每次都从内存中读取,避免数据不一致。
(3)信号处理程序,需保证信号处理程序和主程序的数据一致性,当信号处理程序中修改变量以后,主程序能够立即感知变化,从而响应程序。
(c)static
静态的,可以在以下场景中运用:
类内static成员声明属于类而非实例
全局static声明不可被链接
函数内static对象在该函数第一次被调用时初始化,随后一直存在到程序结束
(1)静态成员函数、静态成员变量(结构体/类):
静态:全局统一;非静态:与实例相关
用了static就全局统一,所以和对象无关,a,b的对应成员是同一个,用类名打印都可以
(2)静态全局变量/普通函数
用static修饰的全局变量仅在该文件中生效,(inner内联)
(3)静态局部变量
生命周期:在第一次初始化时创建,在整个程序结束时释放,存在静态全局区。
(d)extern
将一个C文件中的变量或者函数的作用域拓展到整个项目,将变量或者函数在不同文件共享。
(1)修饰变量,extern声明这个变量是在其他文件中定义的
(2)extern定义函数,用法一样。
extern void hello();
(e)new/delete,malloc/free
(f)typedef和define
(g)#define 和const,谁定义变量好
(h)struct和union区别
arm体系架构
操作系统
网络编程
TCP/UDP
(a)TCP怎么保证可靠性
TCP是可靠性传输协议,既然是可靠的,就需要解决比如包丢失了、数据被破坏了、包重复了、乱序了等等这样的问题
(1)建立连接:通过三次握手建立连接,保证连接实体真实存在。
(2)数据校验:TCP每一段报文头都有校验和,用于检验报文是否损坏。
(3)序列号和确认应答:TCP发送的每一个包都有一个序列号,可以让接收方知道收到了哪些包,哪些包丢失了,重复的包可以丢弃,可以通过序列号排序,且每个发送的包都会有一个确认应答消息。
(4)重传机制:当未收到确认应答消息,会利用重传机制:超时重传、快速重传、SACK、D-SAC。
超时重传:每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。
快速重传:以数据为驱动,服务器如果收到乱序的包,也给客户端回复 ACK,比如收到乱序的包 6,7,8,9 时,服务器全都发 ACK = 5,这样客户端就知道5丢失了,当客户端收到三个相同的 ACK 报文时,会在超时之前,重传丢失的报文段。
(5)流量控制
当接收方来不及处理发送方的数据,能通过滑动窗口,提示发送方降低发送的速率,防止包丢失。
接收方返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送。
(6)拥塞控制
拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况。即防止发送方的数据填满整个网络,在网络出现拥堵时减少数据包的发送,网络恢复后它又会增加数据包的发送。标志:发生了超时重传,就会认为网络出现了拥塞。
有慢启动,拥塞避免,快速重传三种机制。