秋招基础知识盘点

秋招快要结束了,忙活了三个月左右,把三年学的东西都整合了一遍相当,遇到了很多问题吧,这篇博客记录我学的关于c++等等的基础知识,目的一是以后需要的时候方便些,二是希望可以帮到以后找工作的学弟学妹们。顺便攒攒人品吧,祝愿10月拿到心仪的offer

本篇博客基本是以目录形式将秋招的基本问题给出,不可能是像百科全书一样答案都会给出来,仅仅是秋招中笔试面试常碰到的问题我将其进行了归纳,既可以用于学习,不会的进行查资料学会,又可以等学完所有再来进行溜一遍

 

一、C:

  1. 类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)//强转,将const转为非const(取出const),类之间,重解释
  2. 算符优先级:(前导->单目->双目->三目->赋值->逗号)  (双目:算数->移位->关系->逻辑)
  3. 宏定义:#ifndef   or     #pragma once
  4. 数组以及二维数组每个变量含义,定义
  5. 字符数组和char*的区别(1、sizeof,2、常量与变量,3、代码区和栈区)
  6. 结构体,联合体,字节对齐
  7. 堆与栈区别(1、申请方式,2、分配方式,3、大小(堆比栈理论上大),4、效率)
  8. const与#define区别(1、const有类型检查,#define单纯替换,2、多次用到const更省空间)
  9. 发生缓冲区溢出的几种情况:(1、数组越界,2、未分配空间,3、分配空间未回收)
  10. static(1、生命周期:到程序结束,2、只在当前源文件有效,3、不支持extern拓展,4、存储在全局区,5、未初始化默认为0)
  11. strcat效率问题及改进(提供一个新参数,提供前面字符串结尾位置)
  12. 预编译(又叫预处理,完成头文件的展开以及宏定义的替换)
  13. fseek(调整文件指针的位置)
  14. ~(该符号后面加变量会隐式转换为int类型)
  15. 判断非零整数x二进制表示下,有多少bit是1(x&(x-1))
  16. printf中参数同时出现a++和++a:(遇到a++会记录此时a的值为最后输出结果,遇到a和++a则不会将此时的计算结果作为最终输出,只会修改a的值,在最终输出的时候都输出a的值(所以++a和a的结果是一样的))
  17. volatile const(这里面要注意一个变量同时被这两个关键字进行修饰,和变量与只用const修饰的区别)
  18. 前,中,后缀表达式:(中缀转前后缀:二叉树解决。前缀转中缀:从右向左入栈。后缀转中缀:从左向右入栈)
  19. extern(1、不能包含对应的文件(重定义),2、声明方式(extern+类型+变量),3、函数默认是带有extern的)
  20. sizeof(1、返回值隐式转换为无符号整型,2、为一个整型表达式,而非函数)
  21. 短路原则(||    &&)

二、c++

  1. c和c++区别(1、面向过程和面向对象,2、new和malloc以及delete和free、3、cin,cout和printf,scanf,4、缺省参数,5、函数重载(底层的命名规范不同))
  2. c++的class,struct(1、默认权限,2、默认继承方式,3、class可以定义模板函数,struct不行)
  3. 类和对象(类:具有相同属性和方法的个体的抽象。对象:与类的关系类似于数据类型和变量)
  4. 类和对象实例化(静态建立:A a,动态建立:A *pa = new A();)
  5. 如何创建一个类只能建立在堆(栈)上:(堆:1、西贡设为私有,2、1是无法解决继承问题的,可将构造析构都设为保护权限,然后定义两个static public类型函数进行构造析构。栈:将operator new()设为私有即可)
  6. 类六个默认成员(1、构造,2、析构,3、拷贝构造,4、赋值运算符重载,5、取地址运算符重载,6、const修饰的取地址运算符重载)
  7. 异常(c:断言,assert,errno,c++:1、try,catch,throw,2、派生自公共基类exception的标准异常,3、异常处理函数)
  8. 初始化列表(1、初始化列表优先于构造函数(为啥?多调用了一次构造函数)2、哪些成员必须在初始化列表初始化:1、const(只能初始化列表初始化,不能赋值),2、引用,3、构造体内未初始化值的)
  9. 拷贝构造:(1、必须引用传参,2、深浅拷贝,3、应用场合(1、用一个已有对象创建一个新对象,2、传参参数的对象,3、返回值对象))
  10. explicit(防止隐式调用构造函数)
  11. 赋值运算符重载(赋值运算符与拷贝构造区别(拷贝构造:用一个已有对象初始化准备创建的对象,赋值:对已有的对象进行拷贝赋值))
  12. const(1、成员函数用const修饰是在后面,2、常对象只能使用长函数,3、const函数更加的安全)
  13. static(1、所有成员共享一份,2、成员变量类外初始化,3、可以直接类名作用域调用,4、静态函数内部只能调用静态成员变量,5、不可以继承,6、不支持虚函数,7、线程函数只能为静态函数)
  14. 友元(1、友元函数不是类的成员函数,2、不能继承,3、不支持虚函数,4、可以通过对象使用该类的所有成员,5、一定程度破坏了封装性)
  15. inline(1、inline对于编译去只是个建议,编译器自己选择是否将该函数当作内联函数,2、编译期编译器对函数调用的地方进行展开,没有开辟栈空间的开销,3、定义在类内部的成员函数默认为内联函数,4、debug下无真正的内联,release才实现了真正的内联,5、不支持虚函数,6、函数体内代码较长或出现循环等其他复杂结构建议不要用)
  16. new/delete的调用过程(1、new/delete(new(1、调用operator new()分配空间,2、调用构造函数初始化对象),delete(1、调用析构函数清理对象,2、用operator delete)),2、new[](1、调用operator new[]开辟所需空间再加四四个字节的空间;前四个字节存放数组个数,然后使头指针向后偏移四个字节,调用N次构造初始化),delete[](头指针再向前四个字节开始,一次性调用operator delete释放空间)ps:只有当自定义类型且显示自定义析构函数时编译器才会多开四字节存放元素个数)
  17. 继承(菱形继承相关问题(解决方法:虚继承(虚基表的推出)))
  18. 多态(静态联编:编译时决定(重载,模板),动态联编:运行时决定(虚函数,协变(协变是指返回值必须是父子关系的指针或引用)))
  19. 纯虚函数,抽象类,接口类
  20. 模板(原理:编译器的推演,实例化后生成对应代码,还有一堆东西)
  21. 引用(1、引用是对应变量内存地址的别名,2、指针与引用的区别(1、初始化,2、++,--,3、sizeof,4、原理),3、引用不一定消耗内存空间,c++没有规定引用底层实现,看编译器实现)
  22. 静态成员函数和内联函数不能是虚函数,友元函数和构造函数不能是虚函数,但是析构可以
  23. 用老代码实现新需求:应该遵循开闭原则,尽量不改变原有代码,而应利用结构写一段新代码
  24. A* obj = new B()  如果obj->虚函数,则从对象B的虚表找,如果obj->普通函数,则从A类型中找该函数
  25. 构造函数和析构函数中调用虚函数采用静态联编
  26. #define和const的区别:(1、编译器处理方式不同(define预处理,const编译运行),2、类型检查,3、存储方式不同(define不分配内存,const会),4、const可以节省空间,5、提高了效率,6、有些调试工具可以对cosnt进行测试,而不会对define进行测试)
  27. 顶层const和底层const(const int* p:底层const,int* const p :顶层const。区别:1、底层const不可以赋值给普通指针,顶层可以,2、类型转换函数const_cast只能改变底层const)
  28. final和override(都只能修饰虚函数)
  29. extern “c”
  30. STL相关
  31. c++内存管理,内存池技术
  32. c++类中的数据成员和成员函数内存分布
  33. this指针
  34. 构造函数几个关键字(default,delete,0)
  35. 对象复用和零拷贝
  36. decltype()和auto
  37. 智能指针
  38. c++11新特性

三、网络

  1. 通过DNS对域名进行解析,过程如下:
    先查浏览器缓存,查系统缓存,查路由器缓存、查ISP缓存、没有就按照DNS服务器的搜索逻辑从根域名服务器开始递归搜索,最终得到一个IP地址,此时客户端浏览器发起一个http会话,转交运输层
  2. http请求行,请求头,请求正文,请求行有get,post等等方面的东西
  3. 为啥进行网络分片:数据链路层有最大传输单元MTU的特性,它限制了数据帧的最大长度,当要传输的IP报文超过MTU时,就分片
  4. 什么时候发RST包:1、建立连接,SYN了,对方端口没开。2、服务器崩了,在客户端发现服务器崩溃之前就重启了,之前的连接信息都没了,服务器就发个RST。3、TCP想取消一个已有的连接,这可能会造成RST攻击
  5. RST攻击:1、A和B正常通信,C伪造A发个RST,B就断开连接。2、A和B正常通信,C伪造A发个SYN,B认为A已经疯了,主动发个RST
  6. tcp,udp,ip头
  7. tcp与udp的区别
  8. udp优点:发送数据之前不需要建立连接,不需要维护复杂的链接状态表,只有八个字节的首部开销,网络拥塞不会使发送速率降低
  9. tcp为啥可靠:
    三次握手,四次挥手,为啥不能是两次三次,以及最后的time_wait用2MSL(1、确定已发送的数据在网络中消失,2、以及确认对方已经收到我的关闭命令),握手第三次丢了咋整(发送RTS,并CLOSED,防止SYN flood)
    面向字节流:以流的形式传输缓存区满了就划分为几段进行传输
    流量控制:控制发送方的发送速率(停止-等待,滑动窗口)
    重传(超时重传,快重传,sack)
    拥塞控制:慢启动,拥塞避免,快重传,快恢复
  10. 网页解析的过程与实现方法
    应用层: 通过DNS对域名进行解析,过程如下:
    先查浏览器缓存,查系统缓存,查路由器缓存、查ISP缓存、没有就按照DNS服务器的搜索逻辑从根域名服务器开始递归搜索,最终得到一个IP地址,此时客户端浏览器发起一个http会话,转交运输层
    运输层: 建立TCP连接,传数据
    网络层: 查路由表,转发IP数据报
    数据链路层: 使用ARP协议找到MAC地址转发,数据帧
    回复:
    浏览器向WEB服务器发送了一个Http请求,服务器返回相应数据给客户端,浏览器拿到响应数据后开始解析:
    1.解析html文档,边解析边显示
    2.遇到引用外部css文件或者图片,浏览器发送请求给服务器,拿到对应的css文件和图片资源,这个请求不会影响html的加载
    3.碰到js时,则等待直到js加载和解析完毕,才恢复html渲染。
  11. OSI七层

四、操作系统

  1. 进程线程的联系区别(1、调度:资源分配的基本单位,独立完成任务的基本单位。2、拥有资源:线程拥有少部分必不可少的资源(线程ID,当前指令指针PC,寄存器集合以及堆栈)。3、系统开销:创建进程与撤销进程所需要的系统开销很大,线程则比较小)
  2. 进程的组成:1、进程控制块(PCB),2、程序段,3、数据段
  3. 进程通信:管道(共享文件),socket,共享内存,剪切板,消息队列
  4. (互斥)临界区遵循的原则:1、空闲让进,2、忙则等待,3、有限等待,4、让权等待
  5. 信号量:是一个二元组(s,q),s是非负初值的整型变量,q是一个初始状态为空的队列,s表示系统中某类资源的数目,P/V操作,P(wait),V(signal)
    同一个信号量可以被系统的同一个线程获取,之后由另一个线程释放;而互斥量则要求那哪个线程获取的互斥量,哪个进程要释放这个互斥量
  6. 死锁与活锁的概念,
  7. 死锁产生的必要条件:1、互斥条件,2、不剥夺条件,3、请求与保持条件4、环路等待条件
  8. 死锁的预防:1、不太好,2、对于一个已经获得资源的进程,若新的资源请求不能立即得到满足,则它必须释放所有已经获得的资源,劣势:不适应剥夺资源之后代价较大的场合。3、预先静态分配法(进程在运行之前一次性给他分配所有需要的资源,劣势:降低资源的利用率)。4、有序资源分配法,给每个资源编号,只能申请编号之后的资源,不能申请之前的资源了,不会出现互相请求的资源形成环的情况了,不过由于对各种资源编号后不宜修改,从而限制了新设备的增加,而且会造成资源浪费,对资源按序使用也会增加程序编写的复杂性
  9. 死锁的检测:发现死锁的原理是考察某一时刻系统状态是否合理,是否可以
  10. 饿死:正常IO密集型线程比CPU密集型线程要更受欢迎,但如果一个CPU密集型线程获得较高的优先级的时候,有些IO密集型线程就会一直等待,如果很长时间都不能获得执行,则会饿死,解决方法就是逐步提升等待时间过长的得不到执行的线程的优先级
  11. 分段和分页的区别:1、页是信息的物理单位,段是信息的逻辑单位。2、页有内部碎片,无外部碎片,段有外部碎片,无内部碎片。3、页的大小是固定的且由系统决定的,段的长度不固定,不同段有不同的段长
  12. 段页式虽无外部碎片,但是内部碎片要比页式分配多一些
  13. 缺页中断:系统发现自己请求的页面找不到了,就会发生缺页终端,在外存中找寻需求的资源,如果内存有空闲的话,将这段外存中的东西放进内存里
  14. 页面置换算法,当内存不够用的时候,我们需要将内存换到外存里面,常用的有最近最少使用(LRU),以及先进先出(FIFO)
  15. I/O模型:1、阻塞,2、非阻塞,3、多路I/O,4、信号驱动I/O,5、异步I/O

五、数据库

  1. 视图:是一张虚拟表,并不真实存在(相当于封装起来的sql语句。为什么?1、安全:有些表数据是私密的。2、高效:复杂的连接查询效率比较低)
  2. 索引:提供服务器快速在表中查询一行数据的数据结构,可以比作数据的目录,像是在图书馆找一本书,默认数据结构为B-TREE,适用于表数据量够大,增删改较少的表,索引需要单独开辟空间进行维护
  3. 索引缺点:1、索引创建维护耗费时间,随数据量增加而增加。2、索引栈物理空间,如果建立聚簇索引,需要的空间会更大。3、对表中数据增删改,索引也需要维护
  4. 事务:是指作为一个基本工作单元执行的一系列sql语句的操作,要么完全的执行,要么完全的都不执行
  5. ACID:(1、原子性。2、一致性。3、隔离性(其他事务不可见)。4、持久性(事务提交,所做的修改会永远保存到数据库,事务的存在是解决操作过程的ACID问题))
  6. 触发器:是由时间来触发某个操作,在insert,update等,当数据库系统执行这些时间时,会激活促发其执行相应的操作(作用:1、数值达到一定要求,进行特定处理。2、写入数据表前,强制检验或转换数据。3、触发器发生错误时,移动的结果会被撤销)
  7. 游标:是一种能从包括多条数据记录的结果中每次提取一条记录的机制。游标充当指针的作用,尽管能便利结果中的所有行,但它一次值指向一行
  8. 存储过程:实际上是封装在服务器的一段sql代码片段,已经编译了的代码,客户端去调用存储过程,执行效率很高
  9. 存储引擎:InnoDB,Myisam(主要这两种)
  10. InnoDB:是事务型数据库的首选引擎,支持ACID,其他存储引擎都是非事务安全表,支持行锁定和外链,mysql5.5之后默认使用InnoDB。    特点:支持事务处理,支持外键,支持崩溃修复和并发控制,如果对事务完整性要求高(银行)或要求实现并发控制(售票),那么InnoDB有很大优势
  11. Myisam:基于Isam存储引擎,他在web数据仓库最常使用,有较高的插入,查询速度,但不支持事务,不支持外键。    特点:插入数据块,空间和内存使用比较低,如果表只为了插入数据和读数据,那么Myisam会实现处理的高效率,对完整性,并发性较低也可以使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值