字节绿洲工作室实习 游戏客户端一面凉经

发点面经希望能求求好运~
4.7早面,两天后挂了,面了1h无手撕。面试官人还是不错的。
另外面试官那边说在招的都是ue的项目,主要就问基础知识了(八股盛宴)

自我介绍略。
-----------
1.说一下多态
√(静态多态函数重载和模板,动态多态派生类和虚函数

2.说一下虚函数怎么实现和调用
√ (虚表,虚表指针)

3.虚表什么时候初始化
√(虚表编译时,虚表指针new的时候)

4.多继承几个虚表指针,内存分布?
√(子类继承了几个基类就有几个虚表,和对应的虚表指针)

5.定义一个空的class,编译器默认会帮我生成哪些函数?
?(回答的是构造、析构、拷贝构造、)
(---实际应该还有赋值运算符和两种取址运算符)

6.默认生成的构造和析构是虚的吗?
√(构造不是虚的,析构没有子类的话默认也不是虚的,但如果是有子类那父类必须得是虚的)

7.刚刚提到默认生成的拷贝构造,那么它是一个深拷贝的实现还是浅拷贝实现?
?(没准备到,一开始说了浅,但是想到浅只是新指针指向,如果两个指向同一个资源,delete两次就坏了,于是说了深。这里面试官还引导我说一下深浅拷贝的概念。)
(---实际默认实现是浅拷贝!!但确实也存在上面的那个隐患,所以需要人为的重载)

8.说一下C++的内存分区,以及各个区的功能


9.静态成员变量,在那个分区?
√ (静态存储区)

10.函数内的静态变量或者CPP文件下的静态变量
√(都是静态存储区,前者即使作用域消失也还会在内存中存在,只是没法访问;后者可以文件内访问,只是没法跨文件)

11.那它们三的初始化的时机是一样的吗?
√(C++中的类静态成员变量和cpp文件下的是main执行前,函数的局部静态变量是首次调用函数时。

12.New和malloc的区别


13.什么场景使用new什么场景用malloc
?(这里说了需要构造对象用new,需要分配内存给基本类型又不需要构造的时候用malloc

14.New和Malloc分配的时候,释放时的方式?
√(delete/free)

15.Malloc申请内存的释放,可以只释放一部分吗?
√(free我记得只能释放完整的内存吧)
(---如果想动态调整倒是可以用realloc??这个不太清楚)

16.指针引用区别


17.class里有三个int,用sizeof给这个class的引用和指针取值,他们的值是多少,一样的吗?
√(不一样,引用就是class原大小12,指针就是4or8)

18.指针变量所指向的地址不能改变,应该哪里加const?
int * const

19.内容不能改变呢?
const int * 
(---其实还有int const * )

20.四种类型转换,每个的作用


21.static_cast相比C语言用括号进行转换,好处是什么?
X(只说了更安全会有类型检查……)
(---实际还有,C语言只用于值类型,static_cast能用于指针、引用以及类)

22.现在对两个无关的类型,用static_cast进行转换,会得到什么?
√(说了编译时就会报错)

23.两个无继承关系的类型,用dynamic_cast进行转换,会得到什么?
?(说了运行时报错)

24.运行时报错的具体表现?
?(指针类型的转换失败,就会抛出nullptr,引用类型的异常,抛出bad_cast
(---背倒是背了,但是答的时候没有注意大前提……无继承类型的话,是编译时报错……转换失败才是上面这两种……)

25.智能指针说一下


26.shared_ptr作为函数的参数传递时,会增加引用计数吗?
√(值传递会调用shared_ptr的拷贝构造,引用计数会加,但是引用传递就不会)

27.如果是我用拷贝的方式来传递,他是在什么时候把加一给减掉了?
√(函数执行完,局部变量生命周期结束时,拷贝的那个shared_ptr对象自己的析构调用时减1

28.Unique指针,可以写一个函数,它的返回值是unique指针吗?
X(我说要分情况,如果一个函数里局部变量的unique指针,不能这样返回,如果全局的就可以)
(---这里应该是完全没答到点上。函数返回值直接用unique_ptr是恰当的用法,临时对象直接通过移动语义传递独占所有权。)

------数据结构篇-----
29.说一下栈和队列,应用场景
√(函数调用,回溯算法//BFS,FIFO策略)

30.如果在C++里自己实现队列(不用STL),有那些方式?
√(链表队列,数组用循环队列)

31.用数组的方式来实现的缺点是什么?
?(会有空间的浪费,队列最大长度也有限)

32.现在我把队列改造成一个带优先级的优先队列,我现在我向里边插入一个元素,它大概的流程是怎样的?
X (这里当作成了OS里的那个多级队列,直接超级大爆,后面面试官甚至提醒了我堆排序也没唤起记忆)

33.计算哈希值有哪些常用方法
(说了MD5码,SHA256,简单的话就取模)

34.遇到冲突怎么解决?
√(链地址,开放地址法)

35.链地址法怎样来解决哈希冲突。而且使用这种方法,最后查找的时候是怎样来查找?
√(指针数组,取模后找对应槽位的链表进行遍历,顺便提了一下链地址如果长了,负载因子高了也需要动态扩容并调整哈希函数)

36.用哈希表实现的容器?


37.红黑树相比于二叉平衡树的优点?
√(只说了平衡的严格程度,插入和删除效率也更高,虽然同为O(logn)但红黑树所需要的旋转更少)

-----根据项目问八股环节---------
38.“从操作系统层面考虑序列化,中间大概发生那些流程,把内存的数据转换成硬盘中的数据?”
X (文件IO忘了,只说了转换为流文件再写入磁盘)

39.这个过程它会涉及到操作系统里边用户态和内核态的切换吗?
X(一开始说了不能,爆了,下面面试官再问的时候才说能)

40.用户态和内核态就是他设计出来的主要目的是什么?
A:内核态可以访问调度各种资源数据,包括外围设备,用户态只能访问分配的资源。

41.游戏的存档IO这一步,可以在主线程进行吗?他会不会导致游戏就是卡住了,比如你写的东西很多
A:有可能

42.那你会考虑怎么实现和解决?
A:可以考虑协程

43.我们先说协程,它本质上是开了一个新的线程,还是用其他的方式来实现?
√(说了一下协程的原理)

44.稍微发散一点,如果我现在很多数据量很大的需要写入到硬盘中,并不一定是游戏存档。你来写程序的话,会写一个多线程的方式的程序,还是写一个多进程的方式的程序更好一些。
A:认为多线程好一些,会共享内存且线程切换开销小一些,但是要注意写入时的保护(感觉是一个开放性问题,还有什么可以说的吗?)

45.那有哪些线程同步的方式?
A:临界区,互斥锁,信号量

46.假设我们用信号量的方式,简化一下,比如就两个线程,一个写的,一个读的,这个信号量大概是怎样来操作的?
A:我说可以允许多个读线程并发,读与读之间可以不互斥,但写线程要和所有其他读写线程互斥(感觉答的不对口)

47.UI相关有用到什么设计模式吗?
A:我回答了UI管理器用了单例,然后一些其他对象触发UI逻辑更新时会用到观察者

------
没有手撕
------
反问
问了面试官部门现在的工作内容?然后实习生进去一般是做什么?
问了如果Unity转UE有什么建议还是说工作室会有什么指导?

#牛客AI配图神器#
全部评论
为什么会挂啊,明明感觉几乎都答出来了啊,到底谁在赢啊
点赞 回复 分享
发布于 04-17 18:58 福建

相关推荐

评论
8
40
分享

创作者周榜

更多
牛客网
牛客企业服务