快手C++搜推部门一面

发面经攒人品~

上来先问了下为什么不做算法(做个雷达深度学习和大模型属实是差太远),研究方向是什么,然后直接八股:

1. 智能指针用过哪些,各自适合于什么场景
2. 虚函数是怎么实现运行时多态的,虚函数查表的开销有多大(静态多态和运行时多态那个开销更大)?
查表的时间复杂度是 O(1),因为虚函数的偏移地址在编译期间就确定了,调用的时候直接可以用,但是后面面试官又问从 cpu 指令角度看还有什么开销,问了 ai 大概有这些开销(相比于普通函数调用的开销):
首先我们说下虚函数在底层角度会多执行三步:
获取 vptr->计算函数地址(偏移量是编译器就定了无所谓,但需要访问虚函数表 )->调用函数
    - 影响最大的是如果 vptr 或vtable 不在 cpu 高速缓存中的话,会触发缓存未命中(因为前两步大致的汇编代码是 `mov rax, [rdi] ; 假设rdi是对象地址,rax = vptr` 与 `mov rbx, [rax + 0x10] ;` 需要访问内存,就会发生缓存未命中,但是普通函数或者静态多态的地址在编译器就确定了,可以直接使用固定地址调用,就无需从内存中读取数据),这会延长大约 50+时钟周期(普通函数调用就 1~3 个时钟周期)
    - 调用函数时,因为 call 的是间接地址(即虚函数表中存储的内存地址,存在寄存器中被调用),会导致 CPU 指令预取失效,流水线需要重新同步,产生 3~10 个的时钟周期(所以即便虚函数表在缓存中,虚函数调用也普遍比普通函数或静态多态函数慢这么多)
3. 移动语义简单说一下(这里移动语义答的不是很好,一慌就和 ai 发生幻觉了一样乱吐词,可以后面多了解一下具体应用上的移动语义),问知不知道 move 的底层实现(说到强转,又问有哪些转换)
4. Cpp 中有哪些锁(这部分答得不是很好,可以系统梳理一下),粒度最小的锁是哪个(基于 atomic 的原子操作是粒度最小的,精确到单个内存位置),自旋锁什么场景使用(临界区执行时间很短,自旋等待的开销小于线程阻塞/唤醒的开销,以及不希望线程阻塞的实时系统)
5. 问了解哪些常用的数据结构。
6. 操作系统的虚拟内存说一下,一个页大小大概是多大,还有哪些页大小,页大了或者小了有什么优缺点(可以了解一下 THP 透明大页的概念)
7. 场景题:微博这种搜索平台如何设计一个实时统计一定时间段(比如 5min)内 topK 热点关键词的系统,用那些数据结构或者软件可以做到?
8. 手撕 LRU
9. 反问环节:主要做的是快手的搜索架构,还做一些AI搜索,与快手视频的RAG
全部评论
有没有大手子懂得,可以说一下像第7道场景题怎么回答面试官会比较满意?
点赞 回复 分享
发布于 09-03 08:46 陕西

相关推荐

10-13 00:04
已编辑
滴滴_金融_测开(实习员工)
面了一个小时平台消费岗1. 怎么查找要回收的垃圾2. GCroots有哪些3. G1的结构,怎么回收的,为什么用这个4. region中大对象有什么特别处理方式吗5. 如果新生代里面有一个要回收的,老年代也有一个,然后老年代的引用着这个新生代的,会发生什么(不会)6. RAG有哪些分块,你用的是什么7. RAG幻觉怎么办8. Quartz原理9. 他怎么实现任务调度,然后怎么抢占的10. 让你实现一个这种多节点抢占怎么实现11. XXL-JOB的负载均衡怎么实现的12. MQ怎么保证消息可靠,什么时候落盘13. 分布式环境下,如果主节点落盘,从节点还没有同步,然后主节点挂了怎么办14. MySQL中是怎么做的,怎么保证原子性呢15. 为什么binlog和redolog要两阶段提交呢16. redolog什么时候缓冲区会刷盘17. HTTP2.0和1.1区别(这方面答的很好,群里也分享了我的笔记,答的对方直说可以可以)18. 你刚刚提到QUIC,说一下这个吧19. 输入URL流程一如既往问我才大二能实习多久,20分钟后约二面手撕是全排列的变种,然后我想到最简单的后问我时间复杂度(我还答错了),然后让我优化(只需要说出思路,思路完全正确)反思:有的八股还是不行,还好不会的也可以转变思路掰扯掰扯,还是要努力成为八股战神,20分钟后约二面
查看19道真题和解析
点赞 评论 收藏
分享
评论
6
21
分享

创作者周榜

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