腾讯 C++ 后端游戏服务器面试 一面凉经 (社招)
1.实现memcpy拷贝函数: void memcpy(void* psrc, void* pdst, size_t length)
2.实现字符串反转,以逗号作为切割符,切割的子串以单词作为单元反转
输入:hello world, god bless you
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怎么实现的?
#腾讯IEG##腾讯##面经##社招#