阿里暑期实习一面面经 C++后端开发
自我介绍
项目
- 介绍项目实现流程
- 项目是如何实现高并发的
- epoll怎么实现的,与select、poll区别
- 非阻塞是什么
- 边缘触发(ET)是什么
- 线程池是怎么实现的,比起使用单个线程的好处,线程池节约的是哪里的开销(创建销毁的开销大概是多少,线程空间设定的多少,线程处理完任务切换的内存空间?
- 这一部分具体实现我不太了解,我回顾的时候问题描述地不是很清楚,面试官应该在引导我,可是还是答不出来……
- 线程如何实现安全的,锁和信号量在线程互斥中怎么实现的
- 解析报文使用的有限状态机,怎么实现的,状态机有几种状态
计算机网络
- tcp/ip四层模型分别是什么
- http协议是什么,http3.0了解吗(不了解,是不是3.0也忘记了
- tcp三次连接
- http协议用的tcp还是udp(不太了解,瞎答的tcp,然后问那http可以用udp吗)
- ip和端口,端口是什么作用
操作系统
- 进程间通信的方法
- 项目中的线程是在内核态吗
- 互斥与同步有什么方法
- 信号量底层怎么实现的
- 互斥锁
C++
- C++的三大特性
- 静态多态和动态多态是什么
- 初始化列表了解吗
- 初始化有哪几种方法
- 类里面成员的初始化在什么时候初始化的?一开始还是使用的时候初始化?
- static什么时候初始化?
- 虚函数表(结合了实例问问题,答得不好)
- 给了A,B,C三个类,C继承B,B继承A,问调用C的方法底层是怎么实现的
- 调用C的方法,实际上是执行A,B,C三个类中哪个类的方法?
- 函数变量是A的引用,是怎么调用虚函数的(dbq,连题目都没听懂…
- 智能指针
- weak_ptr是如何解除shared_ptr循环引用的?
- unique_ptr实现细节:
- 如果有两个ptr相互指,有没有问题?
- 一个指针指向一个资源,是什么时候释放指针?(dbq还是听不懂题目
- new,malloc
- 内存相关
- 堆、栈区别
- 堆可以扩容吗
STL
- vector和list区别,查找、删插元素的时间复杂度
- vector和list删插元素,迭代器有什么变化吗?
- 有没有不能遍历的容器
- 讲一下map容器
- unordered_map容器了解吗
最后
- 做项目中有没有遇到过问题,怎么解决的?
- 小组合作中有没有遇到问题,怎么解决的?
算法(30min)
- 写一个二叉树的数据结构,实现dfs和bfs
- 实现一个给定大小的循环队列,尽可能完善功能
- 给一个数N,给出大于或等于该数的最小素数回文数(要满足素数,并且该数是回文串)
- ps:阿里编程平台是不能编译的,没有测试用例,相当于一块白板。30min大概写出来2道题,第三道没时间写,面试官会问一下思路
反问
- 面试有什么评价和之后面试的建议
面试总结
- 第一次面试,准备地还不够充分,一些原理要结合实践再加深一下理解(线程池、智能指针、虚函数)
- 面试官问项目基本上是把项目上出现的每个名词挨个问了一遍,对于写在简历上的每个词都要清清楚楚
- 面试足足面了1h+30min算法,每个问题尽量多回答一点,不然一直在问一直在问新的知识点……