腾讯 搜索广告c++面经分享
简历上的项目1: C++ Web Framework REST API 框架(反复重点问了这个项目)
项目源码 : https://github.com/wfrest/wfrest
项目是基于c++ worklofw(https://github.com/sogou/workflow) 框架之上的拓展插件,所以也问了一些底层workflow相关的问题。
简历上的项目2: 基于协程的c++服务器框架
项目源码 : https://github.com/BurgerGroup/Burger
项目是魔改了经典秋招项目muduo,task都封装为一个协程,自动切换调度,是有栈协程。
问题:
1. 为什么选择workflow作为底层,与libhv,asio的差别。
主要回答了他的任务流的设计,底层的任务调度模式(与muduo的one loop per thread做比较), 如何应用多继承(比较常见的框架都是基于对象,很少简单有这种设计巧妙的多层继承架构),顺便问了一波经典c++继承八股,虚表之类的。
因为workflow是一个纯异步框架,介绍了如何实现异步,比较了和我的另一个协程框架如何做异步的区别。
2. 问了wfrest项目的一些设计。
利用前缀树存储path,介绍了一下如何管理生命周期。
问了http1.1相关的八股,https相关八股。
介绍了如何写http parser。
问了下application/x-www-urlencoded,multipart/form-data相关区别,如何实现解析。
问了一下项目中遇到什么困难,如何解决优化。(主要说了利用calgrind和perf去做性能分析的经历,然后还有一些设计纠结的问题,打压测试结果和其他框架做了对比)
3. 协程项目
问了如何实现协程(主要就是那段汇编切换寄存器,还有hook的原理)
问了O1,O2,O3差别,知道编译器有哪些优化。
问了经典八股协程,线程,进程的区别。
然后说到协程并不能带来性能提升,性能的核心还是epoll,顺便又说了一波epoll八股。
4. 算法
一个归并排序的题,因为项目里总是提到json,让我写了一个函数判断json字符串是否valid
在workflow中有一个简单的json解析器,我写过一个相关的代码解析: https://zhuanlan.zhihu.com/p/493430118
#C/C++##面经##腾讯##项目#