腾讯 C++ 后端游戏服务器面试 一面凉经 (社招)

我去年211研究生毕业,一直在一家通讯公司,做了一年半的 QT  的 Windows桌面端软件开发。想投腾讯的类似岗位,之前投递过 WeGame客户端,二面被刷了。12月找小伙伴,内推了腾讯视频,然后HR直接连简历关都没给过😂
第二天被捞,直接通知我第三天早上面试,岗位从我原本希望去的 “Windows客户端”,变成了另一个团队的 “C++ 后端游戏服务器开发”。不过,我之前没做过 linux 的任何开发,心想,去试一试吧,看看难度究竟多大。然后真是一盆冷水,浇得那是一个透心凉啊。


一开始,面试官啥也没问,直接2道题,编码时间40分钟,

1.实现memcpy拷贝函数: void memcpy(void* psrc, void* pdst, size_t length)

2.实现字符串反转,以逗号作为切割符,切割的子串以单词作为单元反转
输入:hello world, god bless you

输出:world hello, you bless god

编码是腾讯会议里面的面呗,ACM输入模式,就是没有测试案例,案例要自己写。
40分钟之后,做出来了。面试官看了,不太满意:

题目1,想考察的是,如果  A B 两个内存地址,如果有重叠的情况,该如何避免。我没写这一块,面试官就给我2分钟,让我思考,让我口述解决方法。我说,如果A的后端的某一块区域,重叠了B的前端,那就倒序,依次复制。面试官说可以,让我直接改代码。
5分钟改完。面试官又问,有没有优化办法,比如原本循环N次,改为循环N/8次。我没思路,面试官人挺好的,就点拨了一下,我立马想到,可以把每8个字节组成double类型,一个个double进行复制,就能节约次数了。


 题目2,我写的反转思路是,通过空格,切分后,存入一个vector里,对vector进行一个反序,再拼接。面试官说,步骤太冗余,而且使用了额外的空间,让我看看能不能再优化。
我当时想了想,没啥思路,通过空格拆分完后,第0个和最后一个,长度都不一致,我也想不出原地swap的方法😂面试官说没关系,就这样吧。 (我感觉第二题我最多只能拿50分)



之后就是技术轰炸,大约问了40分钟:

1.面试官 : 请说一下“字节对齐”的概念。64位系统和32位系统,默认多少字节,来对齐的。
struct T {char a; double b; void* c; void func(){}}; 
sizeof(T)?      返回多大?
2.面试官 : 大端序 小端序,是如何用代码识别
3.面试官 : 虚继承的底层如何实现的

4. C++编译的4个过程,分别生成了什么文件。链接过程,解决了什么问题,为什么要有链接?

5.  重定向解决了什么问题?链接的过程,假如有3个文件,A文件和B文件都用了C的函数,链接的过程中,A和B的中间产物,请问它是如何识别C里面函数的地址的?

6. 重定向与动态链接的问题

7. 从汇编的角度,阐述一下,一个函数的调用过程

8. 你用过协程吗?协程和刚刚这个汇编的问题,很有关系

9. 子函数执行完后,回到主函数,我要如何知道主函数下一步需要执行的指令。如果要存指令的地址,请问存在什么地方?

10. 平时使用linux还是windows开发?

11. 假如有一个函数,函数里有一个char数组和int数组,如果数组过大,有什么风险?
面试官:
void func() {int arr[100w];}    子函数使用了100万的数组,请问有什么风险?

12. 我要你写一个windows的工具,去检索一下,我们代码里有哪一些,是有违规操作的地方?比如说,我有没有办法知道,某一个函数里,他的栈申请的大小有多大,会不会栈溢出?在不运行的情况下,只检测代码,有什么手段?

13. 给你一个库,比如.lib文件,当你拿去使用的时候,你如何知道每个函数,在运行时候,它的栈大小是多大?尝试从汇编的角度去思考。这个需要有一定的汇编基础,才能答出来。

14. 我问:咱们项目里会经常接触汇编这些底层的东西吗?

面试官: 不会经常接触,但是,一旦遇到问题,像刚刚说的那些问题,得要有一定的汇编知识,去支撑。比如说,我们内部,经常会有各种库嘛。当我们去调用一个同事的库的时候,我们是怎么去试验这个函数,肯定要先有一些甄别的手段。然后我们的栈也是很有限的。我们也不可能随意其挥霍我们的栈。

面试官: 另外,你刚刚问,为什么要用汇编,是因为用到了协程,比如微信的协程,他最核心的代码,就是用汇编。就是我刚刚说的,一个函数的回调过程。如果不了解函数调用过程,直接去用协程的话,很容易出问题。

15. 你如果没有linux的开发经验,那我接下来要问的问题,可能会比较吃力,比如linux的操作,IPC调用。

16. 我创建一个TCP连接,我给对端发生了一个信息,如果receive接口,收到的信息是0,那么意味着什么情况?

17. 你答的不是很对,那我换句话问,创建一个TCP链接,过程是怎么样的?

答:…………(balabala,3次握手过程)。所有信息都是在3次握手之后发送的,如果,握手失败的话,那接收端,收到的信息,就理论上是失败,或者空白。

面试官:  3次握手基本对,但是结果,不是我想要的结果。在调用receive接口的时候,其实对端已经断开连接。

18. 四次挥手的过程?里面有一个叫做time_wait的,用来解决什么问题

19. 假设,我发一个比较大的UDP的包,一个40K的包,请问对端,收到这个40K的包,会乱序吗?

答:不会乱序。

面试官:请问是什么原理?乱序的UDP,为何它的单个报文,会顺序正确?它是基于网络的哪一层,来保证报文不会乱序的?是IP层,还是哪一层?一个mpu的大小,也就1.5K吧,那底层肯定要拆包,那具体是哪一层,保证你mpu拆包完之后,再重组,还有序呢?

20. 面试官:答不出来?那基于刚刚的问题,请问TCP的粘包,又是怎么回事?

答:因为TCP里面有一个Nagle算法……

面试官:(打断)Nagle算法?不对不对不对。那我问你,Nagle算法去掉之后,他就不粘包了吗?Nagle算法只是一个参数,告诉Tcp的底层,尽快将业务包,往外推,而不是说,保证不粘包。

21. 你有用过epoll和select,请问他们的原理

22. 最后一个问题,RAII 模式,解决的是什么问题?    ((Resource Acquisition Is Initialization),也称为“资源获取就是初始化”,资源统一管理机制 )

23. RTTI(Run-Time Type Identification),有没有了解?

24. 我们有一个类,可能它的基类指针,指向了一个它的派生类对象,请问我如何判断,他是不是指向派生类?

答:dynamic_cast

面试官:请问dynamic_cast怎么实现的?

 

这次是一面,从早上9点,一直面试到中午11:40,面试官全程,一个耳朵挂着耳机在开会,另一个耳朵挂着麦克,在和我面试。不得不说,面试官真的挺拼的,经验也很丰富,人很和蔼。
之前听说过 IEG 的难度非常大,确实,感觉和我上次面试的 WeGame ,难度完全不是一个量级的。
不过也毕竟是社招,希望找到经验丰富的人,难度自然会提升不少。只可惜我之前完全没做过Linux相关开发,面试官问我linux的问题,会不会。我只好直接说,没接触过。面试官也很无奈,只好选一些C++和操作系统、网络的问题,来问我。
问题中,有很多底层的问题,都需要用汇编的思路去想。汇编我真是一窍不通,所以全程,我基本都在发呆(满脑子:“这问的是个啥啊,项目里完全没用过……”)😂
题目我只勉勉强强,答出来不到一半。一曲凉凉,实在是不会。如果问一些常用的,比如智能指针如何实现,或者一些项目里常用到的技术,我还能说出来一点。今天问的题目,感觉是我面试这几年来,见过的最难的底层原理性的问题了,真是需要对C++吃的非常透彻,代码底层实现,汇编底层实现,都需要非常了解才行。还需要有业务层的丰富经验,来支撑。

最后,大家交流一下🙂,大家应该也有很多参加过,腾讯的社招面试的小伙伴吧。大家的难度,差不多都是这样的吗?😶(顺带问一下,有没有同为 Windows桌面端软件开发 的小伙伴啊

 

 

 

 

 

#腾讯IEG##腾讯##面经##社招#
全部评论
说实话这些问题 看似你觉得底层 其实不然 都是要基本掌握的知识  就像他回答的你 一旦遇到问题,像刚刚说的那些问题,得要有一定的汇编知识,去支撑。比如说,我们内部,经常会有各种库嘛。当我们去调用一个同事的库的时候,我们是怎么去试验这个函数,肯定要先有一些甄别的手段。然后我们的栈也是很有限的。我们也不可能随意其挥霍我们的栈。
2 回复 分享
发布于 2021-12-04 10:44
加油
1 回复 分享
发布于 2021-12-04 17:12
感谢楼主分享,这里多数问题太不常见了
6 回复 分享
发布于 2021-12-04 07:26
记录的很仔细,感谢!
5 回复 分享
发布于 2021-12-03 23:27
大部分问题是否《深入理解计算机》系统那本书涉及了?
5 回复 分享
发布于 2021-12-04 00:03
我去问的好难😢
点赞 回复 分享
发布于 2021-12-04 14:36
对于游戏服务器开发是要掌握的知识(偏中后期)。 c语言+操作系统+网络,可能是做基础平台的。
点赞 回复 分享
发布于 2021-12-04 21:52
这么多问题,楼主是怎么记住的?😯
点赞 回复 分享
发布于 2021-12-04 22:34
21届,最近也在社招了。。还是得把基础打牢😅
点赞 回复 分享
发布于 2021-12-17 14:37
你敢信你的算法题是我面实习的算法题,给了我三道,两道是上面这个,另外一道是两个队列实线栈,也是40分钟😂
点赞 回复 分享
发布于 2022-01-04 03:00
不是mpu  是,mtp 最大传输单元。
点赞 回复 分享
发布于 2022-01-30 12:15
编程题的第二题是剑指offer的58题,我没看书也不知道做,今天看到书了才知道原来翻转两次。。。😅
点赞 回复 分享
发布于 2022-03-10 15:22
我是废物,我很抱歉
点赞 回复 分享
发布于 2022-06-29 16:29
可能使同一个面试官,也是戴着耳机
点赞 回复 分享
发布于 2022-12-13 23:42 江西
靠,我实习面试和你大部分题目一样
点赞 回复 分享
发布于 2023-02-23 20:15 甘肃

相关推荐

牛客771574427号:恭喜你,华杰
点赞 评论 收藏
分享
牛客717484937号:双飞硕没实习挺要命的
点赞 评论 收藏
分享
评论
53
274
分享
牛客网
牛客企业服务