微派 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。

全部评论

相关推荐

评论
点赞
4
分享

创作者周榜

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