八股
一、说说多态
1、什么是多态:
2、多态的两种类型:编译时多态(重载)、运行时多态(重写/虚函数)
3、实现多态的条件(三个):
(1)有继承
(2)有虚函数重写(即动态绑定)
(3)至少一个基类类型的指针或者基类类型的引用。(用于对虚成员函数进行调用)
4、基类中的虚函数必须要实现吗?
基类中的虚函数如果是纯虚函数,不需要实现,此时基类不能实例化对象;main函数中没有基类及其子类的实例对象,可以不实现,有实例对象必须实现。
5、为什么抽象类不可以实例化对象?
类实例化对象时,会为成员变量和成员函数分配内存,纯虚函数定义了成员函数地址为空,无法分配内存。
6、什么是动态绑定?
程序执行期间判断所引用对象的实际类型,调用相应的方法。
每个类会为所有的虚函数维护一个虚函数表,并且有一个指针指向这个表的首地址,这个虚函数表记录着该类所有虚函数的入口地址。当类被实例化后,会有一个虚函数表指针。
指向动态绑定的三个条件:通过指针来调用函数(实际上指针指向虚函数表);指针upcast向上转型;调用的是虚函数。
7、函数重载是如何做到的?
函数重载要求:函数名相同、函数参数的个数、类型与顺序至少一个不相同。对函数返回类型不做要求。只有返回类型不一样,无法构成重载。
c++代码在编译时根据参数列表对函数进行重命名。如fun(int,int)重命名为fun_int_int。函数重载本质上是不同的函数,占用不同内存,入口地址也不一样。
8、构造函数不可以是虚函数:虚函数要指针,构造函数完成前还没有把类实例化,没有地址。
9、析构函数必须是虚函数,可以是纯虚函数,但是必须要有结构体:如果不是虚函数,当一个基类指针指向子类后被释放时,不会调用子类的析构函数。子类调用析构函数实际上是调用了虚构函数链。
10、菱形继承问题:一个子类从不同路径继承父类,会导致实例化子类时实例化了两次基类成员,造成资源浪费。可以用虚继承解决。
二、stactic关键字
1、static意思是静态的,用于修饰局部变量、全局变量和函数。
修饰局部变量:变量不再存储于栈内,而是存储在静态区,被初始化为0。函数结束后不销毁,下次进入函数后该变量仍然存在。
修饰全局变量:普通全局变量定义在函数体外部,在静态区分配存储空间,编译器自动对其初始化。普通全局变量对整个工程可见,其他文件使用关键字extern外部声明后可以直接使用。 静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。 在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。
修饰函数:在函数的返回类型前加上static,就是静态函数。例如:static int main() 静态函数只能在声明它的文件可见,其他文件不能引用该函数。不同文件可以使用相同名字静态函数 非静态函数可以在另一个文件直接引用。
三、指针和地址的区别
指针是变量,它由地址和类型两部分构成,存储地址类型。指针的值是地址。地址只是一个十六进制字符,对应某段内存。
变量是一个有名字的,可以供程序操作的存储空间。
四、函数指针和变量指针大小一样吗
一样,64位下为8,32位下为4。
数据结构
一、HASH(散列)
1、哈希算法
哈希函数是一种映射关系。输入任意长度的数据,输出固定长度 的数据。
简单取余、线性函数算法、随机函数法等。
2、实现方法:通过一定的哈希算法,对一个对象的地址算得其哈希值。这个hash值就是hashcode,对应着hash表中的位置。
3、哈希冲突的解决办法:
①拉链法:用链表存储相同哈希值的元素
②扩容哈希
③引入红黑树:链表过长(默认超过8),将链表改为红黑树
④开放地址法/线性探测法
4、一致性哈希算法:
分布式存储情况下,如何进行资源分配?【key-value】--哈希。
简单取模哈希运算下,服务器扩张时会导致哈希映射的改变,资源的转移,因此引入哈希环。服务器与资源都有一个哈希环,服务器在哈希环上表现为节点,资源分配在右侧离其最近的节点上。
问题:分布不均。
解决办法:引入虚拟节点。因为节点越多,节点之间越均衡。
算法
一、快排
类似于分治。选取一个元素,使左边小于它,右边大于它。
操作系统
1、线程池
优点:避免频繁地销毁或者创建线程。
2、EPOLL底层实现:于select和poll的区别(掌握,待补)
3、core dump
核心转储。是程序崩溃时系统报错下来的快照。
4、进程是如何调度的:
调度算法:抢占、非抢占;
从优先级、时间片、短时间进程、先入先出等几个维度进行调度。
进程的上下文切换:
进程的上下文切换指的是CPU切换运行不同的线程。由PCB来维护一个进程。PCB包括进程的唯一标识符与分配给进程的内存。进程上下文切换本质是PCB的存档与新/旧PCB写入。
CPU的上下文切换:寄存器与程序计数器的保存与覆盖。寄存器与程序计数器指的是一个【任务】。根据【任务】的不同,CPU的上下文切换也指进程、线程or中断上下文切换。
5、命令行抓包:tcpdump
网络
1、路由协议:
常见的动态路由协议:RIP、OSPF、BGP、MPL
RIP(Routing Information Protocol)路由信息协议:记录路由器到目的网络所走过的距离;只和相邻路由器交换信息;路由信息变化时(不变化也会定期交换消息),向相邻路由器广播交换路由表,包括目的地、下一条路由器与跳数;使用距离向量算法;有跳数限制,适用于小型网络。收敛慢。
OSPF开放最短路径优先协议:是一种IGP协议,使用分布式的链路状态协议;会向AS内所有路由器发送消息(泛洪),内容包括自己的链路信息;会在链路变化时向所有路由器同步消息;没有跳数限制。
BGP:边界网关协议/域间路由协议。采用路径向量路由;交换到达某个网络所要经历的一系列路由。
MPLS:标签交换。
项目
1、P4底层
P4将输入转化为json格式输入bmv2
p4包括解析器、逆解析器、匹配动作表
p4中包头类型的长度需要字节对齐。