拼多多-客户端开发(C++) - 一面 面经

1. 简单做个自我介绍,重点说说你的实习经历和负责的项目。

答案要点:

  • 基本信息:学校、专业、年级
  • 技术栈:熟悉的编程语言、框架、工具
  • 实习经历:公司、岗位、时间、主要工作
  • 项目亮点:解决的核心问题、技术难点、取得的成果
  • 个人优势:学习能力、团队协作、技术热情

2. C++中指针和引用的本质区别是什么?使用场景有什么不同?

答案:

  • 本质区别: 引用是别名,必须初始化且不能改变指向指针是变量,存储地址,可以为空,可以改变指向引用没有独立内存地址,指针有自己的内存空间引用不能有多级,指针可以有多级指针
  • 使用场景: 引用:函数参数传递、返回值优化、操作符重载指针:动态内存分配、数组操作、链表等数据结构、需要改变指向的场景
  • 安全性:引用更安全,不会为空,不会野指针

3. C++的内存布局分为哪几个区域?每个区域存储什么内容?

答案:

  • 代码区(Text Segment):存储程序的机器码,只读
  • 数据区(Data Segment): 已初始化数据区:全局变量、静态变量(初始化)未初始化数据区(BSS):未初始化的全局变量、静态变量
  • 堆区(Heap): 动态分配的内存(new/malloc)由程序员管理,从低地址向高地址增长生命周期:手动分配和释放
  • 栈区(Stack): 局部变量、函数参数、返回地址自动管理,从高地址向低地址增长生命周期:函数调用时分配,返回时释放大小有限(通常几MB)

4. 栈内存和堆内存在分配效率、生命周期、大小限制上有什么差异?

答案:

  • 分配效率: 栈:非常快,只需移动栈指针堆:较慢,需要查找合适的空闲块,可能产生碎片
  • 生命周期: 栈:自动管理,作用域结束自动释放堆:手动管理,需要显式释放,容易内存泄漏
  • 大小限制: 栈:较小(Linux默认8MB),递归过深会栈溢出堆:较大,受系统内存限制
  • 访问速度:栈更快,有CPU缓存支持

5. 如何使用RAII和智能指针来防止内存泄漏?

答案:

  • RAII(Resource Acquisition Is Initialization): 资源获取即初始化,利用对象生命周期管理资源构造函数获取资源,析构函数释放资源保证异常安全,即使抛出异常也会调用析构函数
  • 智能指针: unique_ptr:独占所有权,不可拷贝,移动语义shared_ptr:共享所有权,引用计数,最后一个销毁时释放weak_ptr:弱引用,不增加引用计数,解决循环引用
  • 最佳实践: 优先使用unique_ptr,需要共享时用shared_ptr避免裸指针管理动态内存使用make_unique/make_shared创建

6. 什么情况下会产生野指针?如何在代码审查中识别潜在的野指针问题?

答案:

  • 产生原因: 指针未初始化就使用指向的内存已被释放(悬空指针)指向栈上已销毁的局部变量数组越界导致指针指向非法区域
  • 识别方法: 检查指针声明时是否初始化检查delete/free后是否置nullptr检查是否返回局部变量地址使用静态分析工具(Clang Static Analyzer、Cppcheck)使用AddressSanitizer运行时检测
  • 预防措施: 指针初始化为nullptr释放后立即置nullptr使用智能指针

7. Vector和List在底层实现、内存布局、性能特性上有什么区别?

答案:

  • 底层实现: vector:动态数组,连续内存list:双向链表,节点分散
  • 访问性能: vector:O(1)随机访问,支持下标list:O(n)顺序访问,不支持下标
  • 插入删除: vector:尾部O(1),中间O(n)需要移动元素,可能触发扩容list:任意位置O(1)(已知迭代器),不需要移动元素
  • 内存开销: vector:连续内存,cache友好,扩容时可能浪费空间list:每个节点额外存储两个指针,内存碎片
  • 使用场景: vector:频繁随机访问、尾部操作list:频繁中间插入删除、不需要随机访问

8. 用C++实现一个线程安全的LRU缓存,需要用到哪些数据结构和同步机制?

答案:

  • 数据结构: 双向链表:维护访问顺序,头部最新,尾部最旧哈希表(unordered_map):O(1)查找key对应的链表节点组合:map<key, list<pair<key, value>>::iterator>
  • 核心操作

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

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

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

全部评论

相关推荐

昨天 19:59
已编辑
东南大学 C++
1.你先简单介绍一下自己。2.你去年大二的时候就去字节跳动实习了吗?3.你现在面的是后端岗位,可以接受转别的语言吗?4.你觉得自己比较熟悉哪一块技术?实习项目5.你在字节做的是个什么项目?是客户端相关的吗?6.你大概介绍一下你做的这个项目。7.你们是提供一个&nbsp;SDK&nbsp;给各个业务接入,对吧?8.你说一下你们这个业务整体流程和业务价值。9.你们这套特征处理能力,在业务上到底是怎么用的?10.这个特征只是用于模型训练,还是用户实时请求时也会使用?11.你说的这套逻辑,具体发生在客户端、端上算法包,还是后台服务上?12.你们提取完特征之后,数据放在哪里?本地、云端,还是两边都有?13.你知道提取出来的数据长什么样子吗?包含哪些字段?14.你们有哪些特征?这些特征是怎么分类的?15.如果现在要提取某一个特征,从提取开始到使用结束,完整链路是怎样的?16.数据上传到云端之后会做什么处理?17.本地的数据怎么管理?有没有过期机制?怎么淘汰?18.这个特征的量级有多大?端上的特征规模大概是多少?19.存了特征之后,是端上的&nbsp;SDK&nbsp;自己调,还是会上传到后台&nbsp;/&nbsp;中台再调?20.你们现在到底是哪种模式?21.在推荐场景里,会不会把这些特征带上?22.如果一个业务场景只需要一部分特征,它怎么知道应该提哪些特征?23.哪些特征需要上报到后台?这个是怎么判定的?24.上报失败了怎么办?25.你这块性能有测过吗?大概情况怎么样?26.会不会随着特征数量增加,性能明显下降?27.你们性能损耗最大的点在哪里?28.你负责的“设备特征读取性能优化”具体做了哪些事情?29.你说的缓存特征优化,本质上是在优化什么?30.你说的高中低频分层缓存,为什么能解决问题?31.你这个方案优化的是缓存更新机制,还是读取性能,还是两者都有?32.第一个版本完全没缓存时,耗时情况是怎样的?33.加了缓存之后,耗时情况怎样?34.你加缓存之后到底优化了多少?模块级收益是多少?整体收益是多少?35.这些对比数据是怎么拿到的?是你自己手机上的数据,还是灰度&nbsp;/&nbsp;全网数据?36.你这个埋点埋在哪里?是不是调用开始和调用结束?监控的是耗时指标吗?37.你这个缓存存多久?38.缓存怎么淘汰?39.缓存有没有容量限制?40.你有没有考虑过缓存被写爆、被异常流量打满的情况?41.你的方案有没有考虑边界情况和风险,比如新增特征、异常高频访问、缓存失控这些?42.你们做这个缓存&nbsp;/&nbsp;聚合优化时,有没有细粒度指标去验证方案是否真的有效?43.你们做聚合查询的时候,有没有考虑对调用方耗时的影响?44.你的优化指标为什么模块收益和整体收益差别这么大?45.如果以后别人改坏了这套缓存逻辑,你们现在的监控能发现吗?46.你在字节实习时做的&nbsp;SQL&nbsp;签名化和&nbsp;UNION&nbsp;ALL&nbsp;合并查询,是在解决什么问题?47.这个优化的思路是什么?48.这样做为什么能减少开销?49.把查询聚合后再在应用层分发,会不会引入新的耗时问题?八股50.你们之前做的&nbsp;SDK&nbsp;是用&nbsp;C++&nbsp;开发的,对不对?51.你在学校里主要也是用&nbsp;C++&nbsp;吗?52.你能接受从&nbsp;C++&nbsp;转到&nbsp;Go&nbsp;/&nbsp;后端开发吗?53.你对&nbsp;C++&nbsp;当前的内存管理机制了解多少?54.C++&nbsp;有垃圾回收器吗?55.C++&nbsp;是怎么做内存分配管理的?56.当程序不断申请不同大小的内存时,内存管理器怎么尽量满足这些申请?57.你比较熟悉&nbsp;MySQL,是吗?58.你了解&nbsp;MySQL&nbsp;的索引吗?59.MySQL&nbsp;的索引为什么能加速查询?60.索引本身存在哪里?61.读到索引之后,怎么定位到磁盘上的实际数据?62.TCP&nbsp;的慢启动和快恢复是为了解决什么问题?63.TCP&nbsp;的四次挥手流程是怎么样的?64.HTTPS&nbsp;的连接建立过程你了解吗?65.HTTPS&nbsp;的密钥是怎么协商出来的?66.为什么协商阶段和真正传输阶段使用的加密方式不一样?67.Redis&nbsp;你用过哪些数据结构?68.你们去年写这个&nbsp;C++&nbsp;SDK&nbsp;的时候,开发流程里有用&nbsp;AI&nbsp;辅助吗?69.你写的这部分代码里,AI&nbsp;辅助占多少?70.你和&nbsp;AI&nbsp;在协作过程中怎么分工?71.单测是你们自己写的,还是&nbsp;AI&nbsp;写的?72.你之前参加过&nbsp;ACM&nbsp;吗?算法题链表找环的入口面了一个多小时,问了大半的实习内容。业务是qq的游戏中心后端,用的golang,面试官比较和蔼,但喜欢追问,整体答得也一般,后端知识没怎么复习(恶补)。第二天居然约二面了,本来已经做好复活赛的准备了
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

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