腾讯-微信支付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。

全部评论

相关推荐

不想躺平的咸鱼_:本身就是免费开源的,镜像站反而帮项目扛了国内的大流量!SkillHub 把国内用户的访问都承接在本地,既给我们提速,又帮源站减轻了服务器压力,这明明是双赢的事,完全符合开源共享的精神。查看图片
点赞 评论 收藏
分享
收到了QQ部门的面试,昨天晚上面完,电话面试40分钟,无手撕,面试官非常友善,答不上来也会给你提示,给予充足的思考时间,感觉像是朋友间的聊天。1.开局自我介绍2.问了大概15分钟的项目(分布式系统一类的)3.问了一下是否了解过ai相关的技术栈(不了解)4.系统调用和库函数的区别?(我有点没想起来,然后提示了一下fwrite和write)5.关键字volatile有什么作用6.大端序小端序有什么区别(也想不起来了,只知道顺序相反)7.UDP包的最大长度8.讲一下三次握手的过程9.如果第三次握手ack包丢失但发送方又立马发送了数据会发生什么?10.static静态变量,如果写static int c,然后直接输出c的值是多少?11.设计题:如果有100万个学生的成绩,需要知道前top100,怎么去快速统计出来?(脑抽了没想到堆排序上来,前一天刚看过这道算法题,扯了一些其它排序,分析了下时间复杂度)12.场景题:有一个产品提了一个登陆模块的需求,希望同一个用户30分钟内如果重复登陆会给用户发一个提醒,怎么设计?(不知道,瞎扯了一下定时,token之类的)13.redis有哪些特性?性能的数量级有了解吗?腾讯云阿里云亚马逊的redis容量实力?14.热key大key是什么,怎么解决?15.vim编辑器怎么查找,命令是什么?16.后面就是闲聊了,问我最近有没有看什么技术文档,家是哪里的,未来的职业规划基本都是围绕简历上来问的,感觉是寄了,答得不太好
查看18道真题和解析
点赞 评论 收藏
分享
03-11 20:19
已编辑
门头沟学院 Java
太压力了,面了2个多小时,本菜比已经被拷打的瑟瑟发抖面完两个小时后通知过了1.算法题三道(1)leetcode124 二叉树中最大路径和hard题 因为不久前才刷过撕出来了,又来了一道(2)leetcode 300 最长递增子序列变种除了递增之外还加了一个权重因素,但是思路没变,dp就行(3)寻找词汇库里符合固定长度前缀的匹配单词应该是他们自己题库的题。给了一串单词列表,然后又给了一个单词,一个下标,根据这个下标的前缀去单词列表里面找到所有匹配的单词再返回思路是创建一个单词前缀树,然后根据树找,但是可能是构件树数有问题没撕出来2.全方位项目拷打基本没有问八股,全部都是项目企业场景题,哎哟我操,完全不会。我就纯八股战士,结果没想到一道八股都没问反正尽可能把企业场景往八股上引吧。。1. 微服务多点部署其中一个宕机了怎么办2. 要是mq占据大量CPU该怎么排查?MySQL占据大量CPU该怎么排查?3. 假如说让你实现视频点赞功能,你打算怎么设计?讲讲思路(我知道多级缓存,但是碰巧没背……寄)4. Redis延迟双删是什么,分布式锁,哨兵模式5. MySQL到es同步的延迟该怎么优化6. Rabbit mq的队列是怎么实现的?(这个完全没整明白,可能是队列的底层结构? 反正我硬扯的讲了一下rabbit mq的架构)还扯了很多,但是往后完全就慌了),记住的是这些
查看9道真题和解析
点赞 评论 收藏
分享
评论
2
17
分享

创作者周榜

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