• c++开发面试题


    1.自述项目
    2.cmake和makefile区别

    makefile

    Makefile描述了整个工程的编译、连接等规则,makefile定义了一些列规则来指定,哪些文件需要编译以及如何编译、需要创建哪些库文件以及如 何创建这些库文件、如何产生我们想要的可执行文件。使用Makefile,整个工程都可以完全自动化编译。而且Makefile 可以有效的减少编译和连接的程序,只编译和连接那些修改的文件。

    cmake

    CMake是一个夸平台的安装(编译)工具,可以简单的语句描述所有平台的安装(编译过程)。它能输出各种各样的makefile或者project文件,能测试编译器所支持的c++特性。

    3.leetcode题目,做完之后问优化思路?
    迭代和递归的区别,优劣
    递归的优点:
    代码简洁
    优秀的运行速度
    以及代码简洁带来的程序的易维护性
    递归的缺点:
    函数的调用势必带来出栈入栈的操作,递归次数增多随之会带来的是内存的消耗增加
    代码的过于简洁,会带来程序的理解问题而七拐八拐的函数调用也不利于代码理解
    迭代的优点:
    相对递归来说较少的内存占用
    优秀的执行速度
    相对于递归来说其实更容易理解
    这一点指的是,相对于递归来说,迭代的代码执行流程相对来说更加的通俗易懂,迭代的代码不包含各种匪夷所思的函数调用,跳转和返回值所带来的困惑,程序流程较为通俗
    迭代的缺点:
    -代码的过于依赖循环和判断等结构,势必导致代码的行数增加,随之而来的便是程序的难以理解,复杂晦涩。
    记得有人说过,递归能做的,其实迭代都能做,而且有些情况下,迭代由于没有函数的入栈出栈,占用的内存要少于递归这个方式,但是同时并没有什么执行速度的差别,因此迭代是优于递归的我觉得这个说法其实不尽然。
    4.智能指针
    -简述智能指针
    一共有四种,分别是auto_ptr、unique_ptr、shared_ptr和weak_ptr。
    在C++11中,auto_ptr被废弃掉,取而代之的是独占指针。同时shaerd_ptr和weak_ptr是一起使用的,防止循环依赖的产生,使得shared_ptr得不到释放。
    –为什么要使用智能指针
    智能指针如何实现?
    所谓智能指针,其实就是一个指针类,使用了智能指针之后,当指针的生命周期结束时,会自动调用析构函数释放内存资源,防止内存泄漏。

    智能指针解决了什么问题?
    当我们使用new在堆区创建了内存地址时,有时会忘记使用delete去释放内存,容易造成内存泄漏,而使用智能指针的话,它会自动调用析构函数去释放堆区的资源,从而防止内存泄漏。

    实践中如何选择智能指针?
    如果需要多个指向同一个对象的指针,则可以使用共享指针;反之则选择独占指针
    ----为什么智能指针可以像普通指针那样使用?
    因为其里面重载了 * 和 -> 运算符, * 返回普通对象,而 -> 返回指针对象。
    5.HTTP协议的缓存策略有哪些?
    HTTP协议的缓存策略有两种,分别是强制缓存和协商缓存,强制缓存的优先级大于协商缓存。
    强制缓存是服务器告诉浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行协商缓存策略。
    协商缓存是让客户端与服务器之间能实现缓存文件是否更新的验证、提升缓存的复用率,将缓存信息中的Etag和Last-Modified字段通过请求发送给服务器,由服务器校验。如果文件没有改变,那么直接返回304状态,继续使用浏览器缓存。
    加分回答

    HTTP协议的缓存策略是浏览器每次发起请求时,先在本地缓存中查找结果以及缓存标识,根据缓存标识来判断是否使用本地缓存。如果缓存有效,则使用本地缓存,否则,则向服务器发起请求并携带缓存标识。HTTP协议的缓存策略分两种:强制缓存和协商缓存,而强制缓存优先级大于协商缓存。

    强制缓存:服务器告诉浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行比较缓存策略。
    协商缓存:让客户端与服务器之间能实现缓存文件是否更新的验证、提升缓存的复用率,将缓存信息中的Etag和Last-Modified
    通过请求发送给服务器,由服务器校验。如果文件没有改变,那么直接返回304状态,继续使用浏览器缓存。
    HTTP缓存都是从第二次请求开始的:

    第一次请求资源时,服务器返回资源,并在响应头首部中回传资源的缓存策略。
    第二次请求时,浏览器判断这些请求参数,击中强缓存就直接返回状态码200,否则就把请求参数加到请求头首部中传给服务器,看是否击中协商缓存,击中则返回304,否则服务器会返回新的资源。
    6.什么是野指针
    概念:野指针也就是指向位置不可知的指针
    产生原因:释放内存后,指针没有及时置空,仍然指向该内存

    ===========
    三次握手
    1.客户端发送一个SYN包给服务器端,客户端由closed状态进入SYN-SENT状态。
    2.服务器接收到客户端发送的SYN包之后,会发送给客户端一个ACK确认和SYN包。服务器由listen进入syn-received状态
    3.客户端接收到服务器端的包之后,回复给服务器端一个ack包。客户端进入establish状态
    4.服务器收到ack后进入establish状态。
    三次握手建立完成

    四次挥手
    1.客户端主动关闭连接,发送fin给服务器端。此时客户端不能发送信息,但是还可以接受信息。客户端进入fin-wait1状态
    2.服务器收到客户端发来的fin包之后,首先回一个ack,此时等待服务器传输完成没有传输完的数据给客户端,服务器变为close-wait状态
    客户端收到后状态变成fin-wait2
    3.传输完成后服务器在此发送fin包给客户端,服务器进入last-lock状态
    4客户端接收发送一个ack给服务器。客户端进入time-wait状态。并且等待2msl的时间之后close。服务器收到ack后进入close状态。

    为什么要等待2msl时间
    所谓的msl(max segment lisfetime) 最大报文段生存时间,2msl即是两倍的msl时间,在三次挥手后进行第四次挥手客户端发送一个ACK后进入了time-wait状态,此时要等待2msl时间。原因是担心对方未收到最后的ack包要进行超时重传,此时对方重新发送三次挥手是时候的fin包。
    在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

    说说 TCP 可靠性保证
    crc校验、序列号/确认、超时重传、最大消息长度、滑动窗口、流量控制

    c++重载发生在同一个类中,函数同名形参不同
    函数重写发生在父子类之间,子类对父类的同名函数进行了重写。同名函数的返回值形参也必须相同

    socket
    bind
    listen
    accept
    read、write
    close

    socket
    bind
    connect
    send recv
    close

    物理层
    数据链路层
    网络层
    传输层
    会话层
    表示层
    应用层

    应用层
    传输层 tcp/udp
    网络层 IP, ICMP, ARP, RARP, AKP, UUCP
    网络接口层

  • 相关阅读:
    pandas学习(五)merge
    loganalyzer 展示数据库中的日志
    【华为机试真题Java】用户调度问题
    光猫桥接与直接拨号的对比
    《Greenplum构建实时数据仓库实践》简介
    IBM LinuxONE Community Cloud 免费试用申请教程
    眼内衍射透镜的设计与分析
    Java标识符和关键字,Java常量的定义和分类
    【Vue + Koa 前后端分离】使用开源【林间有风】框架,快速搭建自己的后台管理系统
    【趣味实践】自动补帧算法——RIFE的使用
  • 原文地址:https://blog.csdn.net/weixin_45363995/article/details/126110409