腾讯-微信支付C++ 一面 面经总结

1. 请介绍一下HTTP和HTTPS的区别,以及HTTPS的握手过程

HTTP是明文传输协议,端口80;HTTPS是HTTP加上SSL/TLS加密层,端口443,提供数据加密、身份验证和完整性保护。

HTTPS握手过程:

  • 客户端发送Client Hello,包含支持的TLS版本、加密套件列表、随机数
  • 服务器返回Server Hello,选择加密套件,发送服务器证书和随机数
  • 客户端验证证书有效性,生成预主密钥,用服务器公钥加密后发送
  • 双方使用三个随机数生成会话密钥
  • 双方发送Finished消息,完成握手,后续使用对称加密通信

这样既保证了密钥交换的安全性(非对称加密),又保证了数据传输的效率(对称加密)。

2. 说说进程和线程的区别,以及它们的通信方式

进程是资源分配的基本单位,线程是CPU调度的基本单位。

主要区别:

  • 内存空间:进程拥有独立地址空间,线程共享进程地址空间,但有独立的栈空间
  • 资源开销:进程创建和切换开销大,线程轻量级
  • 隔离性:进程间相互独立,一个崩溃不影响其他;线程共享资源,一个崩溃可能导致整个进程崩溃
  • 通信:进程间通信需要IPC机制,线程可直接访问共享内存

进程通信方式:管道、消息队列、共享内存、信号量、Socket等。线程通信:共享内存变量、互斥锁、条件变量、信号量等同步机制。

内存布局上,栈从高地址向低地址增长,堆从低地址向高地址增长。

3. Epoll的底层实现原理,为什么比select/poll快?ET和LT模式有什么区别?

Epoll使用红黑树存储监听的文件描述符,使用就绪链表存储就绪事件。当文件描述符就绪时,通过回调机制将其加入就绪链表。

Epoll快的原因:

  • 不需要每次都传递整个文件描述符集合,避免了大量内存拷贝
  • 使用事件驱动,只返回就绪的文件描述符,时间复杂度O(1)
  • 支持的文件描述符数量没有限制(select限制1024)
  • 使用mmap共享内核和用户空间的内存,减少拷贝开销

LT(水平触发)模式:只要文件描述符处于就绪状态,就会一直通知。编程简单,不容易遗漏事件。

ET(边缘触发)模式:只在状态变化时通知一次。需要一次性读完所有数据,通常配合非阻塞IO使用。性能更高,但编程复杂度增加。

4. 数据库事务的隔离级别有哪些?分别解决什么问题?

四种隔离级别从低到高:

  • 读未提交(Read Uncommitted):可能出现脏读、不可重复读、幻读
  • 读已提交(Read Committed):解决脏读,但仍有不可重复读和幻读。Oracle默认级别
  • 可重复读(Repeatable Read):解决脏读和不可重复读,MySQL InnoDB默认级别,通过MVCC和间隙锁解决幻读
  • 串行化(Serializable):完全串行执行,解决所有并发问题,但性能最差

脏读:读到未提交的数据;不可重复读:同一事务内多次读取同一数据结果不同;幻读:同一查询在不同时间读到不同数量的行。

隔离级别越高,并发性能越低,需要根据业务场景权衡。

5. 数据库有哪些索引类型?B+树索引的原理是什么?

常见索引类型:

  • B+树索引:最常用,支持范围查询和排序
  • 哈希索引:等值查询快,不支持范围查询
  • 全文索引:用于文本搜索
  • 空间索引:用于地理位置数据

B+树索引原理:

  • 非叶子节点只存储键值和指针,不存储数据,可以存储更多索引项
  • 所有数据都在叶子节点,叶子节点通过指针连接形成有序链表
  • 树的高度低(通常3-4层),减少磁盘IO次数
  • 支持范围查询,可以通过叶子节点链表顺序扫描

聚簇索引:数据和索引存储在一起,InnoDB主键索引。非聚簇索引:索引和数据分离,需要回表查询。

6. C++中常用容器的底层实现是什么?

  • vector:动态数组,连续内存空间。扩容时按1.5或2倍增长,需要重新分配内存并拷贝数据。随机访问O(1),尾部插入删除O(1),中间插入删除O(n)
  • deque:双端队列,由多个固定大小的数组块组成,通过中央索引数组管理。两端插入删除O(1),随机访问O(1)但比vector慢
  • list:双向链表,非连续内存。插入删除O(1),但不支持随机访问,需要O(n)遍历
  • set/map:红黑树实现,有序容器。查找、插入、删除都是O(log n),自动排序
  • unordered_set/unordered_map:哈希表实现,无序容器。平均O(1)查找、插入、删除,最坏O(n)

选择容器时要考虑:是否需要排序、访问模式、插入删除频率、内存局部性等因素。

7. C++智能指针有哪些?它们的区别是什么?

  • unique_ptr:独占所有权,不可拷贝只能移动。开销最小,适合明确单一所有者的场景
  • shared_ptr:共享所有权,使用引用计数。最后一个shared_ptr销毁时释放资源。有一定开销(引用计数、控制块),可能出现循环引用
  • weak_ptr:不增加引用计数的观察者指针,配合shared_ptr使用,解决循环引用问题。使用前需要lock()转换为shared_ptr
  • auto_ptr:C++11已废弃,拷贝时转移所有权,容易出错

使用建议:默认使用unique_ptr,需要共享时用shared_ptr,打破循环引用用weak_ptr。避免裸指针管理动态内存。

8. 写时拷贝(Copy-On-Write)的应用场景和好处是什么?

写时拷贝是一种延迟拷贝优化技术,多个对象共享同一份数据,只有在修改时才真正拷贝。

应用场景:

  • C++字符串实现(早期std::string)
  • Linux进程fork:父子进程共享物理内存,写入时才拷贝页面
  • 数据库快照和备份
  • 容器的浅拷贝优化
  • 文件系统(如Btrfs、ZFS)

好处:

  • 减少内存占用,多个对象共享数据
  • 提高拷贝性能,避免不必要的深拷贝
  • 延迟开销,只在真正需要时才付出代价

需要注意线程安全问题,修改时需要检查引用计数并进行拷贝,通常配合引用计数实现。

9. 红黑树和AVL树有什么区别?适用场景有什么不同?

AVL树是严格平衡的二叉搜索树,任何节点的左右子树高度差不超过1。红黑树是近似平衡的,通过颜色标记保证最长路径不超过最短路径的2倍。

主要区别:

  • 平衡性:AVL

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

C++八股文全集 文章被收录于专栏

本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。

全部评论

相关推荐

今天 09:14
已编辑
武汉大学 后端工程师
24年6-8月,我的大三暑假,在鹅厂pcg度过了一段难忘的实习时光。那年的面试很顺利,一共面了3家offer了2家,进了组之后同事们都很好,mt是我的校友,至今仍然保持良好关系。后来我放弃了转正机会,因为觉得保研名额来之不易,我觉得硕士毕业后一定可以有更好的工作,更高的工资。可是之后发生的一切却让我始料未及。一年半过去,我会的东西变多了,却从1月起再难以通过任何一家公司的一场面试。目前的我有客户端的实习经历,有后端的知识储备,有agent相关的项目履历,且因研究生阶段师兄带着做科研对大模型相关的知识也有一定的了解。力扣刷了500题,说多不多,说少不少,反正把hot100和灵神题单1700分以下的都做了遍。但为什么自己就是通不过面试呢?客观分析的话有自己不够专精某一方面的因素,每次面试刚开始被问一个点的时候刚开始还OK,面试官接着深入拷打,我就没啥办法了,临场应变能力也不行。说白了:BFS❤️;DFS💔。另外就是自己没有一套很好的学习体系,总是拆东墙补西墙,因为某次面试被拷打项目,就疯狂准备项目相关的知识,忽略了计算机基础,结果下周的另一场面试被面试官计网OS一通轰炸。说了这么多,聊聊我目前的状态吧。很多大厂最近都开放了春招实习的投递,我目前采取的是海投策略。这周的Timeline大概就是周四要再次征战鹅厂,wxg的面试强度想必大家都了解,我也没有抱希望能过,以学习为主吧。周六的团子笔试应该可以试一下,毕竟有两次机会,而且貌似团子不咋看笔试分数?蚂蚁也发了笔试邀请,但因为阿里系今年笔试的改革,打算观望一下第一场的情况再参加。对自己下阶段的期望,就是不要怀疑自身的能力,然后客观评估自己当前的水准,持续进步。感谢大家能看完哥们的碎碎念,祝各位牛友都早日拿到理想offer,我后面也会持续更新自己的面试记录,也欢迎大家来一起交流呀
今天你投了哪些公司?
点赞 评论 收藏
分享
刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结: 27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
哪些公司开暑期实习了?
点赞 评论 收藏
分享
评论
点赞
12
分享

创作者周榜

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