深圳某私募基金C++岗面经
一面
- 自我介绍,提到了对量化感兴趣。为什么对量化感兴趣?以前投过基金,然后讲了一下对量化交易的理解。
简单讲了一下项目:
- 图像识别项目,你扮演的是什么角色,做这个项目的目的是什么,最后有没有验收?
- 驱动维护,有做新的开发吗,还是只是琐碎的修补?
- 自动测试系统的原理是怎么样的,怎么进行图像对比?这个是有需求还是自己开发的?
算法题
- 手写计算器,需要考虑括号乘法什么的,字符处理不是我的强项,所以写了很久比较挣扎。
八股
- 虚函数是怎么实现的,会增加开销吗?增加的是编译还是运行开销?提到虚函数表,表示指针寻址开销可以忽略。后来发现他问的应该是编译器优化的开销,编译时无法确定要调用哪个函数,不能进行内联优化,分支预测成功率也可能降低。
- c++的map和unordered_map有什么区别?红黑树和哈希表。复杂度呢?O(logn)和O(1)。总是O(1)吗?讲了哈希表的底层实现,提到了哈希平衡算法,平均是O(1)。
- 红黑树有什么好处?红黑树已经排序好了,如果需要找最小或者最大的元素会相当快,linux的线程调度底层就是红黑树。
反问
- 你们公司主要的投资算法是alpha算法,大概是怎么实现的?提到他是开发,这个交易员会比较懂。
- 这个岗位是做什么,你们现在缺哪方面的?公司想搞海外债券方面,可能需要开发交易系统。后面老板可能会和你详细说。
- 所以会有后续面试吗?不能透漏,如果有的话还会有多轮。
耗时1h,总的来说面试官还是相当专业认真的,写题时有错误没有催而是和我一起分析让我不断修改适应更复杂的用例,反问时也比较认真的回答了。
二面
- 自我介绍 讲了一半让我写个题
写题
- ***** ,lc原题
- 直接2分钟C++调next_permutation秒了,结果他让我换种写法,然后试了下回溯,用set去重,经过各处加打印测试成功了。
- 这里用set去重是因为unordered_set<vector>会报错,因为对应的哈希算法需要自己实现,后面面试官马上就问了。
- 他问如果有重复元素并且不希望你去重怎么办。没给我太多时间想。貌似sort之后dfs每次从0开始不用set去重就行了?
C++八股
- 智能指针,我介绍了常见三种以及作用实现,问我weak_ptr什么时候会用。
- 常见容器了不了解,unordered_set哈希算法是什么样的,稍微讲了下底层。
- vector特性
- vector如果多线程另一个线程操作了v那么这个线程的v引用会怎么用,我说stl容器没有线程保护,元素肯定会变化。
- 他貌似想把我往他想的方向引,问我如果只有一个线程,另一个模块增删改查这边会怎么样。我说如果是迭代器会失效。
- 他还是不满意,说如果是引用呢,举了个具体的例子,另一个模块增加元素,这边持有引用。我说vector是动态数组,如果向其中添加元素可能会重新分配内存,导致另外模块持有的引用失效。他听完满意的笑了下。
- 多线程操作C++容器怎么同步?用锁。
-
这个会不会报错?我先指出a包括指针的值和指向的值都不能改变,然后应该不会报错?因为"1"这个应该是在内存常量区的,所以给b赋值应该只是改变了b指向的位置而没有创建新的内存空间。const char* const a = "1"; auto b = a; b = "2";
网络通讯相关
- socket有哪些接口调用?bind,listen,connect。这里应该漏说accept,他引导我说出来了。(面试官好像真的想让我答对)
- epoll和select这两个多路复用接口有什么区别?select是轮询,epoll貌似是树相关算法提高效率?(太久没用忘了)
- 多路复用是什么?比如一个服务端有多个客户端,服务端就需要对客socket进行轮询看有没有数据。
- 进一步问,那为什么不每一个socket起一个线程维护?可以这样,但会浪费资源。(貌似量化行业大佬对八股理解比较深刻,他们不仅希望你知道知识点,还想看你知不知道应用场景和前因后果)
问项目
- 通讯库加速场景,细节。
- 同构和异构的区别。一对一和多对多。
- 问我技术栈其实偏底层,为什么投这边。
反问
- 我问面试官是不是搞服务端的。是的。
- 协作方式,量化一般是扁平化管理?他讲了一下如果我进来大概规划。(难道有戏?)
- 业务范围。他详细介绍了下,量化开发还是服务端居多,包括风控,回测,交易系统,因为业务太多涉及债券,海外等等所以貌似没有精力做底层优化?算法主要是交易员搞的,开发一般也接触不到算法。