信锐 C++二面总结

1. 设计一个高性能的TCP服务器框架,说说你的技术选型和架构设计

答案:

  • IO模型选择: Linux:epoll + 非阻塞IO(ET模式)单Reactor单线程:Redis模型,简单但无法利用多核单Reactor多线程:IO线程 + 工作线程池多Reactor多线程:主Reactor接受连接,子Reactor处理IO(推荐)
  • 线程模型: 1个Acceptor线程:accept新连接N个IO线程:每个线程一个epoll,处理读写事件M个Worker线程:业务逻辑处理
  • 关键技术: 非阻塞socket + ET模式定时器:时间轮或最小堆管理超时连接Buffer设计:读缓冲区 + 写缓冲区,支持自动扩容对象池:预分配连接对象,减少new/delete
  • 参考框架:muduo、libevent、Boost.Asio

2. 说说智能指针的实现原理,shared_ptr是线程安全的吗

答案:

  • shared_ptr实现: 控制块:引用计数 + 弱引用计数 + 删除器引用计数用原子操作(atomic)保证线程安全拷贝时增加计数,析构时减少计数,为0时释放对象
  • 线程安全性: 引用计数的增减是线程安全的(原子操作)但对象本身的读写不是线程安全的多线程同时修改同一个shared_ptr指针本身也不安全
  • 示例
  • 最佳实践: 使用make_shared而非new,减少内存分配次数避免循环引用,用weak_ptr打破自定义删除器处理特殊资源

3. 如何排查C++程序的内存泄漏和野指针问题

答案:

  • 内存泄漏检测: Valgrind:valgrind --leak-check=full --show-leak-kinds=all ./appAddressSanitizer:编译时加-fsanitize=address -g,运行时自动检测tcmalloc/jemalloc:替换默认allocator,提供内存分析mtrace:glibc自带,调用mtrace()开启追踪
  • 野指针检测: AddressSanitizer可检测use-after-free指针释放后立即置nullptr使用智能指针避免手动管理
  • 常见原因: new/delete不匹配(new[] vs delete)异常导致未释放容器中存储裸指针第三方库泄漏
  • 预防措施: RAII原则:资源获取即初始化优先使用智能指针容器存储对象而非指针代码审查 + 静态分析工具(cppcheck)

4. 讲讲虚函数的实现机制,虚函数表在内存中是如何布局的

答案:

  • 虚函数表(vtable): 每个含虚函数的类有一个vtable,存储虚函数地址对象内存布局:vptr(虚表指针) + 成员变量vptr在对象内存的最前面(通常)
  • 调用过程:通过对象的vptr找到vtable根据函数索引找到函数地址调用该函数
  • 多继承情况: 多个基类有虚函数时,对象有多个vptr菱形继承用虚继承解决,引入vbtable(虚基类表)
  • 性能影响: 额外的内存开销(vptr)间接调用,无法内联但现代CPU分支预测可缓解

5. 说说C++11的移动语义和完美转发,std::move和std::forward有什么区别

答案:

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

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

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

全部评论

相关推荐

03-04 07:14
门头沟学院 C++
何木健一:去啥?你能考虑去就是思想有问题,当然一周到岗一天可以考虑一下😨
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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