面经记录冲

文章讨论了如何通过控制C++类的析构函数访问性来限制对象只能在堆或栈上创建。同时,它概述了TLS握手过程和HTTPS的安全性,指出中间人攻击的可能性。此外,还介绍了HTTP/1.1的性能优化策略,如缓存、请求合并和压缩。接着,提到了HTTP/2的性能提升,包括头部压缩、流并发和服务器推送。最后,提及了操作系统和数据库相关问题,以及合并有序链表和搜索旋转矩阵的算法问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C/C++

如何定义一个只能在堆上(栈上)生成对象的类?

只能在堆上:

将析构函数私有化,C++是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。若析构函数不可访问,则不能在栈上创建对象。

只能在栈上:

将new和delete重载为私有,在堆上生成对象,使用new关键词操作,其过程分为两段:第一段,使用new在堆中找到一块内存分配给对象,第二段调用构造函数生成对象。将new操作设置为私有,那么第一阶段就无法完成,就不能够在堆上生成对象。

网络

TLS建立四步:

①:ClientHello 客户端向服务器发起加密通信请求(TLS协议版本、Client Random)

②:ServerHello 服务端向客户端发出响应(确认TLS、Server Random、服务器的数字证书)

③:客户端回应 浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性,然后从数字证书中取出服务器公钥,加密报文(随机数pre-master key,加密通信算法改变,客户端握手结束通知)

④:服务器的最后回应

服务器和客户端有了这三个随机数(Client Random、Server Random、pre-master key),接着就用双方协商的加密算法,各自生成本次通信的「会话秘钥」

HTTPS一定是安全的吗

这个问题的场景是这样的:客户端通过浏览器向服务端发起 HTTPS 请求时,被「假基站」转发到了一个「中间人服务器」,于是客户端是和「中间人服务器」完成了 TLS 握手,然后这个「中间人服务器」再与真正的服务端完成 TLS 握手。

从客户端的角度看,其实并不知道网络中存在中间人服务器这个角色。那么中间人就可以解开浏览器发起的 HTTPS 请求里的数据,也可以解开服务端响应给浏览器的 HTTPS 响应数据。相当于,中间人能够 “偷看” 浏览器与服务端之间的 HTTPS 请求和响应的数据。

但是要发生这种场景是有前提的,前提是用户点击接受了中间人服务器的证书。

HTTP/1.1协议优化

①:避免HTTP请求:缓存技术;

②:减少HTTP请求次数:减少从定向;合并请求,延迟发送。

③:减小HTTP发送次数:压缩,无损压缩、有损压缩。

第一个思路是,通过缓存技术来避免发送 HTTP 请求。客户端收到第一个请求的响应后,可以将其缓存在本地磁盘,下次请求的时候,如果缓存没过期,就直接读取本地缓存的响应数据。如果缓存过期,客户端发送请求的时候带上响应数据的摘要,服务器比对后发现资源没有变化,就发出不带包体的 304 响应,告诉客户端缓存的响应仍然有效。

第二个思路是,减少 HTTP 请求的次数,有以下的方法:

  1. 将原本由客户端处理的重定向请求,交给代理服务器处理,这样可以减少重定向请求的次数;
  2. 将多个小资源合并成一个大资源再传输,能够减少 HTTP 请求次数以及 头部的重复传输,再来减少 TCP 连接数量,进而省去 TCP 握手和慢启动的网络消耗;
  3. 按需访问资源,只访问当前用户看得到/用得到的资源,当客户往下滑动,再访问接下来的资源,以此达到延迟请求,也就减少了同一时间的 HTTP 请求次数。

第三思路是,通过压缩响应资源,降低传输资源的大小,从而提高传输效率,所以应当选择更优秀的压缩算法。

HTTP/2提升性能

①:对于常见的HTTP头部通过静态表和Huffman编码的方式,将体积压缩了近一半,而且针对后续的请求头部,还可以建立动态表,将体积压缩近90%。

②:实现stream并发,多个Stream只需要复用一个TCP连接,节约了TCP和TLS握手时间。另外可以设置Stream的优先级。

③:服务器支持主动推送资源,大大提升了消息的传输性能。

操作系统

数据库

手撕

合并K个有序链表:

shared_ptr实现:

string类实现:

搜索旋转矩阵:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值