跳到主要内容

字节游戏广州工作室UGC实习

基础部分

自我介绍; 拷打项目理解;(25min)

深挖了很多技术点,每个技术点都在向更深的方向去问;
例如我写过一个对象池,面试官会问如果怎么这么样会怎么去解决,可以怎么去优化;

C++部分

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

C#部分

  • 说一说值类型和引用类型的区别;
    • 没什么好说的,但是一开始理解错了,悲;
  • 事件和委托底层区别是什么,看过事件的源码吗?能实现事件吗?
    • 经典的内容,分享了下自己的理解,源码没看过,悲;

算法部分

  • 很经典的K个一组链表翻转;
    • 是OI题,好久没写输入输出了,然后用多空间写的,没写原地的那种,毕竟好久没写输入输出了,不敢冒险;