腾讯实习-PCG一面面经
base 深圳 客户端开发
面了一个多小时,八股文盛宴
- 自我介绍
- 简单拷打项目
- 写一个空类,编译器会自动生成哪一些函数?
- 追问:有移动赋值吗?为什么?
- 空类大小是多少?
- 追问:一定是 1 吗?可以自己去更改这个大小吗?
- 如果在类中字节写了析构函数,会影响编译器对其他函数的默认生成吗?
- 假设在类中有一个成员变量,是
std::string
类型,列表初始化和构造函数里面初始化有什么区别? - 哪些变量是一定要在列表里面初始化的?
- 看一段代码,运行结果是什么?
#include <iostream> class A { public: void func1() { std::cout << "1" << std::endl; } virtual void func2() { std::cout << "2" << std::endl; } }; int main() { A* a = nullptr; a->func1(); a->func2(); return 0; }
- 追问:为什么?
- 追问:调用
func2
的流程是怎么样的? - 说一下虚函数指针是什么?
- 追问:那怎么去找虚函数表?
- C++ 里面有 4 种强制类型转换,分别说一说是哪四种?
- 追问:那
dynamic_cast
是怎么检测是不是子类类型的? - 追问:那
static_cast
还可以转换什么? - 说一说智能指针
- 什么时候用
std::weak_ptr
? - 追问:那
std::weak_ptr
是怎么检测当前还有没有std::shared_ptr
的? - 追问:那
std::shared_ptr
的结构是什么? - 那
std::shared_ptr
线程安全吗? - 说一说
std::vector
和std::deque
的区别? - 说一下
std::move
有什么用? - 怎么区分左值还是右值?
- 追问:那我现在写了一个函数,它接受的参数是一个
std::unique_ptr
,那接受的这个参数是左值还是右值? - 什么是完美转发?
- 多线程中经常要用锁,请你介绍一下你了解哪些锁?
- 自旋锁和互斥锁的区别是什么?
- 写代码怎么去避免死锁?
- 场景题:比如说现在要监控一个主线程,主线程可能会死锁,也可能是没有死锁但是卡死了,我们有没有什么办法去感知这个事情呢?
- 追问:现在程序在用户那里,你要把这个事情上报下来,你会怎么做?
- 追问:我怎么知道这个程序有没有卡死或者死锁了?
- 追问:但是我们又怎么知道他在是哪个函数,哪一行代码里面的?
- 后面又根据回答疯狂追问
- 谈一谈 TCP 的拥塞控制
- 最后手撕 K 个一组翻转链表(一开始停止条件写错了,写了个死循环之间把OJ卡机了,提交不了新代码,后面改A出来了)
- 反问
下午面完,晚上就挂了
面试官人很好,答不出来的问题会做引导。但自己太菜了,有答错的地方,场景题招架不住,后面追问环节,脑袋已经宕机了,没有遇到过这种情况。还要继续背八股,深入基础