快手 软件开发-C++ 一面

1. 自我介绍

2. TCP 三次握手过程是什么,为什么一定要三次

答案:TCP 三次握手主要是为了建立可靠连接,并同步双方的初始序列号。第一次,客户端发送 SYN 给服务端,表示自己想建立连接,并带上客户端初始序列号。第二次,服务端收到后回复 SYN + ACK,既确认客户端的 SYN,也发送自己的初始序列号。第三次,客户端再回复 ACK,确认服务端的 SYN,双方进入 established 状态。

为什么不是两次,主要是为了确认双方的收发能力都正常。如果只有两次,服务端只能确认客户端能发、自己能收,但不能确认客户端能收、自己能发。另外三次握手也能避免历史重复连接请求导致服务端误建立连接。

3. TCP 四次挥手过程,为什么 TIME_WAIT 要等 2MSL

答案:TCP 断开连接通常是四次挥手。主动关闭方先发送 FIN,表示自己不再发送数据;被动关闭方回复 ACK。之后被动关闭方如果也没有数据要发了,再发送 FIN,主动关闭方回复 ACK。之所以通常是四次,是因为 TCP 是全双工的,一方关闭发送方向,不代表另一方也马上关闭发送方向。

TIME_WAIT 出现在主动关闭方,等待 2MSL 主要有两个原因。第一个是确保最后一个 ACK 能让对方收到,如果对方没收到 ACK,会重发 FIN,主动关闭方还能再次回复。第二个是让旧连接中的延迟报文在网络中自然消失,避免污染后续使用相同四元组的新连接。

4. UDP 和 TCP 的区别

答案:TCP 是面向连接的可靠字节流协议,提供确认重传、顺序保证、流量控制和拥塞控制,适合文件传输、登录、支付、接口请求这类对可靠性要求高的场景。UDP 是无连接的报文协议,不保证可靠、不保证顺序,也不保证不重复,但头部开销小、延迟低,适合直播、实时音视频、游戏同步、埋点上报等场景。

TCP 传输的是字节流,需要应用层自己处理粘包拆包;UDP 保留报文边界,但单个报文过大可能会被分片,丢包概率也会增加。所以选择 TCP 还是 UDP,不是看哪个更高级,而是看业务更关心可靠性还是实时性。

5. TCP 粘包和拆包是什么,怎么解决

答案:TCP 是字节流协议,不会帮应用层保留消息边界。发送端连续发送两条消息,接收端可能一次读到两条,也可能只读到半条,这就是粘包和拆包问题。解决方式一般是在应用层设计协议,比如固定长度、分隔符、消息头加消息体长度。工程里更常用的是消息头里带长度字段,接收端先读够头部,再根据长度读完整消息体。

代码:

#include <cstdint>
#include <string>
using namespace std;

#pragma pack(push, 1)
struct MsgHeader {
    uint32_t len;   // body 长度
    uint16_t type;  // 消息类型
};
#pragma pack(pop)

struct Packet {
    MsgHeader header;
    string body;
};

6. HTTP 和 HTTPS 的区别,HTTPS 加密过程怎么理解

答案:HTTP 是明文传输,数据在网络中可能被窃听、篡改或伪造。HTTPS 是在 HTTP 和 TCP 之间加了一层 TLS,用来保证身份认证、数据加密和完整性校验。HTTPS 不是全程都用非对称加密。非对称加密主要用于身份认证和密钥协商,真正传输业务数据时一般使用对称加密,因为对称加密性能更好。

TLS 握手时,客户端会校验证书是否合法,确认服务端身份,然后双方协商会话密钥。后续 HTTP 数据会用这个会话密钥进行对称加密传输。所以 HTTPS 解决的不只是“加密”,还包括“我访问的是不是真的目标服务器”。

7. CA 证书申请和校验流程了解吗

答案:CA 证书本质上是由可信 CA 机构签发的服务器身份证明。服务器申请证书时,一般要生成公私钥对和 CSR 文件,把域名、组织信息、公钥等提交给 CA。CA 会验证域名或组织身份,验证通过后用 CA 私钥对证书内容签名,签发证书。

客户端访问 HTTPS 网站时,会拿到服务器证书,然后用本地信任的 CA 根证书或中间证书去验证签名链。如果证书过期、域名不匹配、签名链不可信,浏览器或客户端就会提示风险。这里比较关键的是:证书里放的是公钥和身份信息,私钥必须只保存在服务器侧,不能泄露。

8. C++ 面向对象的三大特性

答案:C++ 面向对象三大特性是封装、继承和多态。封装是把数据和操作数据的方法组织在一起,对外暴露稳定接口,隐藏内部实现。继承是子类复用和扩展父类能力,但继承层次不能太深,否则维护成本会变高。多态是通过基类指针或引用调用虚函数,在运行时根据真实对象类型执行不同逻辑。

在短视频热点事件实时聚合系统里,可以把不同事件处理器抽象成统一接口,比如点赞事件、评论事件、转发事件都实现同一个 process 方法,调度器只依赖抽象类。

代码:

#include <iostream>
#include <memory>
using namespace std;

class EventHandler {
public:
    virtual void process() = 0;
    virtual ~EventHandler() = default;
};

class LikeHandler : public EventHandler {
public:
    void process() override {
        cout << "process like event\n";
    }
};

class CommentHandler : public EventHandler {
public:
    void process() override {
        cout << "process comment event\n";
    }
};

int main() {
    unique_ptr<EventHandler> h = make_unique<LikeHandler>();
    h->process();
    return 0;
}

9. 虚函数大致是怎么实现的

答案:C++ 的运行时多态通常依赖虚函数表和虚表指针实现。如果一个类里有虚函数,编译器一般会为这个类生成一张虚函数表,表里存放虚函数地址。对象内部会有一个虚表指针,指向对应类的虚函数表。通过基类指针调用虚函数时,程序会先根据对象里的虚表指针找到虚表,再根据函数偏移找到真正要调用的函数。

需要注意的是,虚函数会带来对象体积增加和间接调用开销。如果类作为基类使用,析构函数通常要声明为虚析构,否则通过基类指针删除派生类对象时可能只调用基类析构,导致资源泄漏。

代码:

#include <iostream>
using namespace std;

class Base {
public:
    virtual void run()

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论

相关推荐

不愿透露姓名的神秘牛友
04-30 18:05
空屿编号:你把墨镜摘下来是不是这样😭
点赞 评论 收藏
分享
04-22 23:15
中南大学 Java
时间:4.21公司地点:北京时长:52min做了一些简化,提取了更有借鉴价值的部分1.&nbsp;部门介绍2.&nbsp;自我介绍3.&nbsp;这两个项目你觉得哪个项目复杂度高一些,可以多聊一会4.&nbsp;你这个项目主要是想解决什么样的问题呢5.&nbsp;你刚才说这些方法的话,应该说也是社区内或者说比较常见的一些处理方式了,对吧?我都或多或少都能get到,但是我有一个问题,就是**你做这件事情之前,就是每一个技术的应用之前,你有没有去验证这个技术确实提升了准确率呢**6.&nbsp;我们的这些处理方式是否真正的真的提升了它的准确率。就是我们只是堆砌技术,还是说我们确确实实是提升了这件事情?7.&nbsp;你这一知识库当时怎么选的?你做的知识库是什么类型的知识库?8.&nbsp;那你这知识库里面涉及了哪些方面的内容?比如说文学类的,还是什么科技类的?是什么航天类的等等?有没有就说具体一些?9.&nbsp;那你这个博客内容写的多吗?10.&nbsp;那如果14篇文章的话,而且你这14篇文章看起来所涉及的范围是比较发散的,那么在这种情况下,其实这个rag的检索本身就不容易出现,刚才说的那个检索有问题的情况,这可能本身就不是个问题。11.&nbsp;在我们去真正去做一件事情这的处理的时候,其实我们还是应该先去有一个度量的标准,不然我们优化可能是负优化,我们都不知道对吧?就是说我现在要做&nbsp;rag&nbsp;检索。我要去先做一个度量的方式,然后去验证它的准确率,你应该怎么做?12.&nbsp;你怎么判断问题回答是准确的13.那么我怎么看到线上的这些回答的准确率呢?14.&nbsp;有必要搞多级缓存吗15.&nbsp;好,那首先就多级缓存来说,你觉得,它有什么弊端,还有它有什么优势?这个讲一下。16.&nbsp;我有一个问题,首先其实我们一般认为&nbsp;redis&nbsp;它的那个吞吐是非常高的,而且如果说我们比如说数量很大,Redis&nbsp;它也是支持那个多节点对吧,比如说……&nbsp;不管是哪种方案吧,Redis&nbsp;也可以支持多节点的这种部署,所以在这种情况下的话,我们认为&nbsp;redis&nbsp;从网络压力这一块是没有太大问题的。那么在你看来,有了&nbsp;redis&nbsp;的话,我们还要去引入本地缓存的主要目的是什么?因为刚才你说的只是为了减少网络开销。&nbsp;但是现在我们实际的生产环境中&nbsp;redis&nbsp;的是网络开销&nbsp;其实是没什么太大的问题的。你应该明白我的意思,就是&nbsp;redis&nbsp;网络开销不是它的核心问题,就是我为什么非要引入本地缓存17.&nbsp;我看后面你还自己写过两个&nbsp;SKILL&nbsp;对不对?能具体展展开一个就是你可能平时,有没有平时用的比较多的,我想知道不是那种为了写而写的那种,就真正能解释你生活中问题的那种&nbsp;SKILL18.&nbsp;你最近面试多吗?19.&nbsp;那八九场的话,就是你觉得你做的自己就是面试,就是相当于面试自己的这种&nbsp;Skill&nbsp;和你真正去面试中拿到的面试题,它相似度高吗?&gt;我是我当时了解到,主要是主要是因为网络开销的问题,进一步提升响应速度20.&nbsp;说实话&nbsp;redis&nbsp;并不存在很大量的网络开销问题&nbsp;&nbsp;对不对?21.&nbsp;我看后面你还自己写过两个&nbsp;SKILL&nbsp;对不对?能具体展展开一个就是你可能平时,有没有平时用的比较多的,我想知道不是那种为了写而写的那种,就真正能解释你生活中问题的那种&nbsp;SKILL22.&nbsp;你最近面试多吗?23.&nbsp;那八九场的话,就是你觉得你做的自己就是面试,就是相当于面试自己的这种Skill和你真正去面试中拿到的面试题,它相似度高吗24.&nbsp;OK,&nbsp;那你觉得你这个&nbsp;SKILL&nbsp;有没有帮你解决到一些实际面试中的问题,有没有确实命中的一些面试中的一些真正的面试题25.&nbsp;对你来说,现在比如经验完经历完这场面试之后,你觉得你的&nbsp;SKILL&nbsp;应该如何提升呢?26.&nbsp;你理解什么叫&nbsp;CAS?27.&nbsp;那它和悲观锁有什么不同?那首先第一个问题就是纯靠CAS就能解释就能实现这个乐观锁吗?28.&nbsp;解释一下volatile的这个关键字的目的和作用29.&nbsp;既然我们提到了CAS操作就一定能保证。并发更新的安全性了。那么我们为什么还要用&nbsp;volatile&nbsp;去修饰这个变量呢?这不多此一举吗?30.&nbsp;好,那继续问&nbsp;CAS&nbsp;里面会有什么问题?就它会有什么其他的什么问题呢?31.&nbsp;你了解&nbsp;CAS&nbsp;的&nbsp;ABA&nbsp;问题吗?32.&nbsp;讲一下怎么解决就可以了33.&nbsp;那现在回到这儿来说就是有乐观锁和悲观锁两种锁,对不对。那么,我什么时候要选择乐观锁?什么时候要选择悲观锁?你看,我们知道&nbsp;JDK&nbsp;里面&nbsp;synchronized&nbsp;的关键字是悲观锁,对吧?而&nbsp;ReentrantLock&nbsp;是个就是这种我们一般认为是&nbsp;CAS+volatile&nbsp;这种乐观锁的方式那么这两种方式的话,你觉得我们在应用中。什么情况下会采用乐观锁?什么时候要采用悲观锁?34.&nbsp;为什么?35.&nbsp;这个我知道好,那现在问一个问题&nbsp;就是说,既然高并发情况下用悲观锁就很好,那我无脑用悲观锁不就完了吗?就是既然说。乐观锁有就是说并发高了,它就不行,自选浪费&nbsp;CPU,对吧?那我无脑用悲观锁,不就&nbsp;OK&nbsp;了吗?不挺好的吗?36.那还有一个问题,就是我们刚才说的这些并发的处理的方式。都是基于一个理念叫共享内存,对吧,相当于都是无论是悲观锁还是乐观锁,我们都相当于是要在对象上加锁,然后限制一些线程的进入和退出,对不对。&nbsp;那么有没有别的方式照样可以实现并发更新的?并发更新的这样的一个方式,就除了共享内存方式,还有没有别的。比如说或者说我这么说吧,就全世界上处理同一个数据的多线程更新的这个问题,只有乐观锁和悲观锁两种方式吗?是非阻塞不能处理吗?因为不管是哪个锁,其实都会进入到一个阻塞的状态,对吧?必须是通过阻塞的方式才能搞实现多线程对同一变量的更新吗?37.&nbsp;手撕环节:[电话号码的字母组合](*******************************************************************)48.&nbsp;反问环节
查看30道真题和解析
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务