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
网络接口层

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值