字节一面
自我介绍
因为我本来是投的大模型没中,客户端给我捞起来了,就没怎么深挖项目
算法题
一个比较基础的dfs 但是边界条件漏判断了,主要是第一次用acm模式做,有一些不适应,debug了很久 但是其实做的不太好。主要是一次没过就很紧张了,然后debug的时候没有冷静做printf输出调试。然后遇到段错误一开始是想数组越界,但是我用的都是for auto x 遍历就没想到,以为是递归溢出,然后看了很久是不是结束条件错了之类的,结果是判断重复的时候直接调用了vector.back()但是没有判空,感觉评价会不太好。
提问
面试官说自己不太了解文生图,然后想让我讲解一下图片怎么变成文字的,我说这个其实是对齐的问题。然后讲解了一下一开始clip是怎么训练编码器让图片和文字向量对齐的。
问了一下我的项目本来是解决什么问题有什么优势,又复述了一遍。
问了一下vibe coding是什么 自己平时的使用经验之类的,问问ai写代码擅长的地方和局限性是什么。
C++ :
- c语言 c++ 区别:面向过程面向对象
- c++面向对象三个特点:封装,继承,多态
- 实现多态的原理:虚函数表
- 虚函数表是每个类一个还是每个实例一个:每个类一个
- 智能指针有哪些:unique shared weak ptr
- shared_ptr和weak_ptr区别是什么,weak_ptr作用是什么:weak_ptr解决shared_ptr互相引用,无法释放内存的问题,比较像文件系统的软硬链接
- shared_ptr是怎么管理的:有一个引用数
- 引用数在什么时候增加什么时候减少:构造增加析构减少
- 深拷贝和浅拷贝区别是什么:一个是把数据直接一个字节一个字节复制过去,一个就是把指针复制过去
- 那深拷贝和浅拷贝,引用数会增加吗:我没研究过,推测应该是深拷贝共享指针引用数不会增加,浅拷贝会增加
- 动态绑定是什么:一时间没想起来,编译器在编译时只知道它是父类指针,只有在运行时通过虚函数表(vtable)才能确定调用哪个子类的函数。
- c++内存布局:堆,栈,全局变量与静态变量区, text区
- 问了一下内存管理:栈上是函数局部变量,函数运行完自动释放,然后堆上的是实例的本体之类的,要手动管理
- 问了一下new 和 malloc区别:一个会触发构造一个不会,然后malloc返回void*要自己转换
- 问了一下c++编译分成那几步 这个我还真不记得了 预处理 (Pre-processing) -> 编译 (Compilation) -> 汇编 (Assembly) -> 链接 (Linking)。。
OS
- 用户态内核态区别:主要是权限的问题,系统级的事情比如进程调度之类的要内核去做,用户应用之类的就运行在用户态
- 用户态怎么请求内核服务:通过中断来申请,用户态应用发出请求触发中断,然后让内核提供服务
- 什么时候会触发trap:用户申请服务,或者时间片到了要触发调度之类
- 进程跟线程的区别:前者是资源的最小单位后者是调度的最小单位
- 进程之间的通讯:比如pipline单向传输,邮箱双工通信,共享内存,信号量,socket等
- 问了一下多线程编程 我说我之前不是很擅长这个((
计网:
- TCP UDP区别:前者是面向连接,可靠,字节流。后者是直接发包,不在乎对方有没有收到
- 拥塞控制:讲了一下拥塞控制快增长慢增长的机制和切换
- 怎么保证可靠:ack累计确认
- 讲了一下三次握手四次挥手是什么