字节跳动 C++开发实习 上海 面经
字节跳动C++开发上海实习面经
一面(23号)
时间:大概1h
Q: TCP和UDP的区别
A: TCP是字节流,可靠传输,需要通过三次握手建立连接。UDP是数据报,不可靠且不需要握手。Q: TCP如何实现可靠传输
A: TCP序列号Q: 那TCP如何用序列号来保证可靠传输
A: 介绍了下 握手时交换initial sequence number、ACK、超时重传 和 快速重传Q: TCP的滑动窗口与流量控制
Q: TCP的拥塞控制
A: 回答了些常见的拥塞控制算法: tahoe reno cubic bbrQ: 你提到了 快速重传, 能介绍一下 快速重传在拥塞控制中是如何处理的吗
Q: 死锁的四个必要条件
Q: 举例子讲解如何解决死锁
A: 从破坏死锁的四个必要条件角度回答。举了自己实现课程Project里,以锁的内存地址为顺序加锁以避免死锁的例子。Q: new 和 malloc 区别
A: 讲了一下new expression是如何调用operator new、构造函数 和 处理异常的。详细见cppreference - new表达式。malloc的内存只是调用glibc库函数申请一块可用的内存,并没有调用构造函数。而且也不能保证正确的alignment。Q: C++内存管理:
std::shared_ptr
,std::unique_ptr
,std::weak_ptr
Q: 除了
std::weak_ptr
,还有哪些解决循环引用的办法?
A: 瞎说了一个 可以用解决死锁循环等待的办法,允许循环引用偶尔发生。循环引用较多时,构造系统的资源图,在图中找到环,并破坏这些环。面试管回答说实践中的确有这种办法。Q: 来实现一个
unique_ptr
吧,不需要自定义的deleter,简单的就可以
编程题:
LC92 翻转链表m到n:个人博客题解。自己写了一个简单的测试用例测试了一下。
写的reverse函数有bug,找了好久,差点翻车。
二面(26号)
时间:大概1h
- Q: C++从源文件到可执行文件的过程
A: C++标准规定的9个翻译阶段 和 预处理 编译 汇编 链接的对应,详见个人博客 - C++从源文件到可执行文件系列
class A { private: int a; int b; double c; public: virtual void f(); }; class B : public A { private: double d; char* e; public: void f() {} }; B b;
Q: 上面这段程序,
sizeof(b)
为多少
A: 考虑vptr和对齐,关于x64上的虚函数和虚基类相关的ABI,可以参考Itanium C++ ABI - Chapter 2: Virtual Table Layout- B自己的data member:8bytes对齐后为16bytes
- A自己的data member:8bytes对齐后为16bytes
- vptr为8bytes,A为B的primary base class,则A和B共享一个vptr
- 因此总共为16 + 16 + 8 = 40bytes
Q: 上面这段程序存在哪些问题?
A:- 当多态地使用derived class B时,如果A的析构函数未声明未虚函数,可能会导致内存泄漏
- derived class B中的函数
void f(){}
和基类中的virtual void f()
有相同的函数签名,虽然此时会override基类中的virtual void f()
,但为了避免函数签名写错而导致错误的声明一个新函数,还是要标上override
Q: 讲一下项目吧
A: 讲了下自己实现的C++20 coroutine + Linux io_uring 的网络库。项目GitHub。鬼扯了这个网络库的几个优点:- 使用callback的网络库使业务逻辑割裂,使用coroutine使业务逻辑更清晰
- io_uring大大减少系统调用的次数,socket的读写都在内核中完成
- structured concurrency,减少了使用
std::shared_ptr
的次数,使用C++的RAII即可维护对象的生命周期 - File I/O 和 socket 可以在同一框架下使用。
Q: 除了使用coroutine的异步编程,还知道哪些异步编程的模式呢
A: 鬼扯了一下C++23的executor模型和Facebook的libunifex
编程题:
类似LC93复原IP地址的题目。给定一个全为数字的字符串,要将字符串分为5个数字,每个数字不能超过600。
彻底翻车,到最后也没调对。
三面(30号)
时间: 大概1h
- Q: 讲了一下项目
- 就不问你基础了,之前的面试已经问了很多了,来做一个题吧
- 提问时间:这个组主要是实现一个浏览器内核,从头造轮子,包括智能指针之类的都是自己实现的。
编程题
实现一个parser,要求能够parse下面这样的串,并返回一个树。要求检查<a></a>
这样的标签必须能够对应,不能是<a></aa>
<a> <b> str </b> <c> <d> </d> </c> </a>
面试官人特别好,一直在指导我。这个题要注意new出来的东西在匹配失败的时候别忘了delete。LC里有几个类似这种parser的题,见个人博客 - 设计parser
#实习##面经##C++工程师#