近期面试知识点汇总(更新中)

近期面试知识点汇总

1、c++

new和malloc的区别

  1. new是关键字,可重载;malloc是函数,后者需要头文件支持。
  2. new返回的是指针;malloc返回的是void*,需要强转类型使用。分配失败时,new抛出bac_alloc异常;malloc返回null
  3. new和delete可调用对象的构造和析构,malloc不会。

虚函数、纯虚函数:

  • 虚函数:有定义(否则编译不过),可以直接调用,也可被子类重写。

  • 纯虚函数:含有纯虚函数的类为抽象类,抽象类不可被实例化。纯虚函数只能由子类重写实现。

  • 析构函数可声明为虚函数,但构造函数不行:虚函数的作用是父类指针指向子类对象,调用虚函数来实现功能,此时对象已存在,而构造函数是用于创建新对象,是主动行为,不可能由其它指针的引用去调用。析构函数可声明为虚函数,是由于子类具有一些父类没有的成员变量,若调用父类的析构函数来销毁对象,可能造成内存溢出。详细参考:C++中为什么构造函数不能定义为虚函数

  • 虚函数表原理:C++虚函数和虚函数表原理

  • 虚函数由于要维护在虚函数表,所以要占据一个指针大小,也就是4字节。

智能指针:
内存分配:

  • 栈:存放局部变量等,由编译器自动申请和释放。分配的内存地址是连续的,因此空间较小。
  • 堆:存放new出来的(程序员创建的)对象,需要手动释放。分配的内存地址是离散的,类似于链表,存在内存碎片。
  • 全局区:存放全局、static、常量。
  • 文字常量区:存放字符常量。
  • 代码区:存放函数体的二进制代码。

C/C++程序内存的分配

static关键字的作用:

  • 改变变量的可见范围:非静态的变量,可通过extern关键字在不同.cpp文件中使用,而加上static则将该变量的可见性限定在本文件中,其它文件不可见。作用:防止命名冲突。
  • 改变变量的生存期:在函数中定义的局部变量在函数结束后会销毁,而static变量则能一直存在。
  • static修饰类的成员变量时,该成员变量仅能在类内声明,在类外初始化!
  • static修饰的类成员变量没有this指针,static函数仅能访问和调用static的变量和函数。
    参考:C++中static关键字作用总结

内存溢出的情况:

  • 开辟的空间未释放(new了没有delete)
  • 同一空间被多次释放(两个对象的指针指向同一块地址,先析构一个对象,再析构另一个,导致尚有指针引用内存的情况下就释放了它,就会产生引用非法内存的指针)

参考:C++中内存泄漏的几种情况

函数只声明不定义的问题: 若该函数未被调用,则可运行,不出错;若被调用了,则出错。(面试被问到了)
什么时候用到拷贝构造函数:
构造和析构函数的调用时机:

  • C语言不支持重载(这个被问到了,当时不知道。。)

2、数据库

范式:
数据库引擎:
delete drop truncate区别
左右连接、内外连接、全连接、自然连接:
如何提高查询速度:
关于索引:
存储过程:
触发器:
视图:
关于事务:
定义: 事务是指是程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消。
4个特性:
1、原子性:执行操作时,要么全部执行成功,要么全部不执行(只要其中一个指令失败,然后回滚)。
2、一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
3、隔离性:并发事务之间隔离,相互独立,感觉不到其它事务的存在,不能够相互干扰。
4、持久性:当事务正确完成后,它对于数据的改变是永久性的。
并发导致的问题:
脏读: A事务读取了B事务未提交的数据,若B事务回滚,则A的读取和实际不符。
幻读:A事务内执行了 两次相同的 查询,第一次得出结果1,接着B事务添加或删除了数据,导致A事务的第二次查询结果2和结果1不同(多了或少了数据)。
不可重复读:A事务读取了一行数据,B事务改变了这行数据,若A再次读取,则两次不同(两次结果的数据行不同)。
(幻读和不可重复读的区别在于数据不同的情况的差别)
参考:Spring事务的隔离级别和传播行为
什么是事务?事务的四个特性以及事务的隔离级别
锁:

  • 悲观锁(数据库本身具有的锁机制)

防止高并发下对数据的读写导致的问题,一个事务在修改一个数据时,先加锁再修改,防止其它事务同时修改数据。
又分为共享锁、排他锁;
共享锁:多个事务共享一个锁,这些事务只能读取数据。
排他锁:该锁仅能被一个事务拥有,且其它事务不可获得锁;拥有排他锁的事务可以读写数据。

  • 乐观锁(需要用户自己实现)
    在修改数据前不加锁,减少了开销,但通过两次查询来验证数据是否被其它事务改变过。
    锁的参考:什么是乐观锁,什么是悲观锁

3、数据结构和算法

二叉查找树、平衡二叉树、红黑树:
B树、B+树:
topk问题:

4、OS

进程通信方式 & 线程通信方式:
虚拟内存:

  • 解决的问题:很大的作业无法一次装入内存、很多的作业需要同时运行但内存无法容纳。

  • 原理:常规存储器运行作业时都是一次性全部装入,虚拟内存则仅需将当前需要的少量页面装入内存。(时间局限性和空间局限性,程序执行时刚执行完的指令和刚访问过的空间很可能在一段时间内再次使用)。

  • 虚拟内存的逻辑容量由内存和外存容量共同决定。

  • 优点:访存速度接近内存,成本接近外存。

  • 实现:

    1. 分页请求系统
      请求页表机制、缺页中断机构、地址变换机构。
      在这里插入图片描述

    请求分页系统的外存分为2部分:文件区 、对换区。
    文件区离散分配内存,存储在外存存放的数据。对换区充当虚拟内存的空间采用连续分配内存的方式,在win系统中对应在某个盘符后设置的虚拟内存区,linux中对应swap区。

    1. 请求分段系统
      。。。
  • 页面置换算法:opt、FIFO、LRU、LFU、CLOCK、改进的CLOCK

  1. 最佳置换算法OPT:选择以后不用的页面
    最近最久未使用LRU:选择最近最久未使用的页面(堆栈类算法,需要寄存器和栈的硬件支持)

  2. 最不经常使用LFU:将一段时间内访问次数最少的页面换出

  3. 先进先出FIFO:选择最先装入内存的页面(基于队列)

  4. 时钟置换算法CLOCK(NRU):选择最近未用的页面

  5. 改进的时钟算法:考虑页面修改问题

参考:面经

进程、线程内存开辟:
LRU的双向链表实现:
进程、线程、协程:

5、计网

关于http各版本:
post和get方法:
RIP和OSPF的优劣:

  • RIP:
  1. 根据最短距离选择路由,距离用跳数定义,经过一个路由器跳数+1。距离=16时表示不可达。
  2. 仅和相邻路由器交换信息(自己的路由表),不相邻不交换。
  3. 固定时间间隔交换信息(30s)。
  • OSPF:
  1. 可根据链路状态(距离、时延、带宽、费用)选择路由。
  2. 仅链路发生变化时才交换路由信息(RIP是定时刷新)。
  3. 发送信息时,是向自治系统中所有路由器发送。A机发送自己的信息给所有相邻路由器(除了刚刚发来信息的),每个收到信息的再次将信息转发给相邻的(洪泛法) 。最终所有路由器都能得到这个信息的副本。
  4. 每个路由器都拥有整个网络的拓扑图。(RIP则没有)
  • 优缺点比较
  1. RIP实现简单,开销小,但只适用于小型网络(最大跳数15).且RIP“好消息传的快,坏消息传的慢”。故障时收敛慢的例子:路由器A故障,B发现A不可达后将A跳数设为16,但此时C还未得知该情况,将A可达的信息发给B,导致B得到错误情报,再将信息传出。每次传出后跳数+1,达到16时才发现A不可达,但已经耗时很久。
  2. OSPF适用于大型网络,收敛快。但开销大。

6、git命令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值