微派 c++软件开发 二面 面经

1. 说说 C++ 智能指针的种类和区别,shared_ptr 的引用计数是如何实现的?

  • unique_ptr:独占所有权,不可拷贝只能移动,开销与裸指针几乎相同,是首选的智能指针
  • shared_ptr:共享所有权,内部维护引用计数,计数归零时自动释放资源
  • weak_ptr:弱引用,不增加引用计数,用于打破 shared_ptr 的循环引用,使用前需 lock() 升级为 shared_ptr

shared_ptr 引用计数实现:

  • 内部有一个控制块(control block),存放强引用计数、弱引用计数和删除器
  • 拷贝 shared_ptr 时强引用计数加一,析构时减一,减到 0 时销毁对象
  • 弱引用计数归零时才释放控制块本身
  • 引用计数的加减是原子操作,线程安全,但 shared_ptr 对象本身的读写不是线程安全的

2. 内存对齐是什么?为什么需要内存对齐?

  • 内存对齐是指数据存放的起始地址必须是其自身大小的整数倍
  • 原因一:硬件限制,大多数 CPU 访问未对齐的内存需要多次总线操作,甚至直接触发异常
  • 原因二:性能,对齐的数据可以一次读取完成,未对齐可能需要两次读取再拼接
  • 结构体对齐规则:每个成员按自身大小对齐,结构体整体大小是最大成员大小的整数倍
  • 可以用 #pragma pack 或 attribute((packed)) 强制取消对齐,但会牺牲性能
  • 合理排列结构体成员顺序(大到小)可以减少填充字节,节省内存

3. 说说 epoll 的工作原理,和 select/poll 相比有什么优势?

  • select/poll 每次调用都需要把全部 fd 从用户态拷贝到内核态,返回后需要遍历所有 fd 找到就绪的,时间复杂度 O(n),且 select 有 fd 数量上限(1024)
  • epoll 通过 epoll_create 创建实例,epoll_ctl 注册感兴趣的事件,epoll_wait 只返回就绪的 fd
  • epoll 内核用红黑树管理注册的 fd,用就绪链表存放活跃事件,每次只拷贝就绪事件到用户态,时间复杂度接近 O(1)
  • epoll 支持两种模式:LT(水平触发,默认,只要缓冲区有数据就持续通知)和 ET(边缘触发,只在状态变化时通知一次,需要一次性读完数据)
  • ET 模式性能更高但编程复杂,需要配合非阻塞 I/O 使用

4. 说说 TCP 四次挥手的过程,为什么需要 TIME_WAIT 状态?

过程:

  • 第一次:主动关闭方发送 FIN,进入 FIN_WAIT_1
  • 第二次:被动关闭方回复 ACK,主动方进入 FIN_WAIT_2,被动方进入 CLOSE_WAIT
  • 第三次:被动关闭方发送 FIN,进入 LAST_ACK
  • 第四次:主动关闭方回复 ACK,进入 TIME_WAIT,等待 2MSL 后进入 CLOSED

TIME_WAIT 的原因:

  • 确保最后一个 ACK 能到达对端,若对端没收到会重传 FIN,TIME_WAIT 期间可以重新回复
  • 让网络中残留的旧数据包自然消亡,防止被新连接误收,2MSL 足够让所有报文过期

5. 什么是 RAII?在 C++ 中如何应用?

  • RAII(Resource Acquisition Is Initialization)是 C++ 核心资源管理思想
  • 核心思想:资源的获取在对象构造时完成,资源的释放在对象析构时完成,利用

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

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

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

全部评论
感觉你这总结的都很好
点赞 回复 分享
发布于 03-22 19:29 北京

相关推荐

03-13 09:22
已编辑
东莞理工学院 Java
📍面试公司:微派🕐面试时间:03/09💻面试岗位:安卓开发一面❓面试问题:1. 自我介绍,为什么投安卓而不是后端?2. 最近一段实习做了什么业务?遇到最大的困难是什么?怎么解决的?3. 礼物抽奖、奖池模块的完整请求链路是什么?4. 令牌池是什么?0和1分别代表什么?5. 高并发下如何保证抽奖概率稳定?6. 为什么用 Redis List 做抽奖?解决了什么问题?7. Lua 脚本在抽奖中作用是什么?为什么保证原子性?8. 高并发下如何避免令牌重复消费?9. 请求超时、服务异常怎么降级、兜底?10. 风控怎么做?业务兜底、用户兜底、熔断策略是什么?11. 安卓做过什么功能?具体场景、用到哪些技术?12. Glide 图片加载原理,多级缓存、LRU、懒加载怎么实现?13. LRU 算法原理,用什么数据结构实现?为什么用 LinkedHashMap?14. HashMap 底层结构?链表转红黑树条件?为什么要用红黑树?15. HashMap 扩容机制?负载因子作用?16. Java 并发三大问题:原子性、可见性、有序性怎么解决?17. volatile 作用、原理、使用场景?18. synchronized 底层原理?MarkWord、WaitSet、EntryList 作用?19. sleep 和 wait 区别?20. 什么是死锁?怎么写代码模拟死锁?21. 线程池执行流程?核心线程、队列、最大线程、拒绝策略?22. 安卓多线程、协程用过吗?挂起函数怎么理解?23. AIDL 了解吗?多进程通信怎么做?24. C/C++ 掌握程度?25. 网络优化做过哪些?序列化、连接池、IO 模型?26. Ping 原理?ICMP 协议作用?数据包的结构?27. MCP 广场是什么?业务价值、怎么封装、怎么调用?28. RAG 个人知识库怎么做的?向量检索、BM25、多路召回?(叫我现场打开cursor看看怎么使用ai开发的)29. 算法题:买卖股票的最佳时机(只能买卖一次和买卖多次)。30. 对公司业务、面试轮次有什么想问的?🙌面试感想:这次面试感觉面试官非常非常细节,在我说完我的实习项目之后,他觉得我说的太快了听不懂,叫我一个个拆解,把对应的流程功能点遇到了什么问题分点详细的跟他说,并且没听明白就会再问一遍,一定要懂了才会到下一个点,对于部分的技术实现也是刨根问底,问完了对应的一个技术之后还会问相应的底层实现和使用的数据结构,整体感觉这次面试的难度也是比较困难的,但是面试官感觉人挺好的技术也非常在线,学习到了很多东西,一面过,明天更新二面
查看29道真题和解析
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

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