字节游戏广州工作室UGC实习面经(凉经
基础部分
自我介绍;拷打项目理解;(25min)
深挖了很多技术点,每个技术点都在向更深的方向去问;
例如我写过一个对象池,面试官会问如果怎么这么样会怎么去解决,可以怎么去优化;
C++部分
- 说一说指针和引用的区别; 回答了八股的基本不同,又从汇编底层解释了一下,无后续;
- 知道内存对齐吗,结构体内存对齐是怎么样的,举了几个例子; 基本就是围绕char,int,double这几个类型来回排序组合,char在前int在后,int在前char在后,两个char一个int,等等,最后老师也不自信了,不在深究;
malloc
和new
的区别,delete
怎么获取应该释放的大小的; 经典问题,库函数和关键字(重载)的区别,头部保存大小用于判断;- 智能指针了解多少,介绍一下,分别说明对应的作用,
shared_ptr
线程安全吗,哪里线程不安全,怎么解决; 分别解释3个智能指针,前面是经典的八股,三种智能指针。提到了线程问题和循环引用问题。shared_ptr线程不安全是因为引用计数的原因,需要进行原子操作; - 返回局部变量的返回值,该怎么解决; C++特性返回值优化(RVO),但是并不太懂,只是说了一下;也可以考虑使用引用传递;
- 知道
RAII
吗,RAII
的原理是什么,RAII
的好处是什么,RAII
的实现是怎么样的; 核心思想是有用用,无用回收,RAII的实现是通过构造函数和析构函数来实现的,RAII的好处是可以避免资源泄漏,shared_ptr就是一个RAII的实现; - 了解
vector
吗,vector
的底层实现是怎么样的,vector
的扩容是怎么样的,如果扩容了怎么办,迭代器看过源码吗?如何实现的?能补充迭代器吗? 动态数组,通过哨兵标记,哨兵便是"迭代器",vector的扩容是通过realloc来实现的,扩容过程中,哨兵均会发生变化,进而迭代器失效; - 现在有一个情况,要将很大的一组数据放到
vector
里,怎么办,怎么去解决这个问题;将两个数组合并,怎么去解决这个问题;memcpy
和memmove
的区别是什么,源码实现是怎么样的; 最初直接完美转发,后来又说了一下vector的扩容问题;memcpy和memmove大半年不用一次,没记起来。 - 除了
vector
还了解哪些容器 回答了List, map, unordered_map, set, unordered_set; - 你提到了
map
,unordered_map
,map
和unordered_map
的区别是什么,底层实现是怎么样的,map
的底层实现是什么,红黑树是怎么样的,你能写红黑树吗; 区别是一个哈希一个红黑树,unorderd_map是哈希表,核心是哈希函数。map的底层实现是红黑树,红黑树是一种自平衡二叉树; 直接懵圈,显然不能写红黑树,但是简单说了下性质和基本操作; - 说一说cpp的编译过程,分别介绍一下。动态链接和静态链接区别是什么,带来什么影响,动态链接的过程是怎么样的,底层原理和代码知道吗?假如动态库里有一个全局变量和静态变量,会有什么问题,假如本地有一个全局变量,会怎么样。 预处理,编译,汇编,链接。动态链接是在运行时链接,静态链接是在编译时链接。静态链接会将所需内容嵌入。动态链接的过程是先加载动态库,然后在运行时链接。 源码不了解,动态链接的那个全局变量问题,不太懂,但是说了一下大概的猜想;
C#部分
- 说一说值类型和引用类型的区别; 没什么好说的,但是一开始理解错了,悲;
- 事件和委托底层区别是什么,看过事件的源码吗?能实现事件吗? 经典的内容,分享了下自己的理解,源码没看过,悲;
算法部分
- 很经典的K个一组链表翻转; 是OI题,好久没写输入输出了,然后用多空间写的,没写原地的那种,毕竟好久没写输入输出了,不敢冒险;