三月c++面经(英特尔、旷世、云从、地平线)
- 手撕代码
- 面经八股
- unique_ptr和shared_ptr有什么区别,分别什么时候使用,请简述他们的实现方案
- shared_ptr和普通指针在你的工作中,你是怎么考虑使用的
- C++11有哪些新特性,14和17呢
- STL有哪些数据结构,底层分别是什么原理
- 红黑数为什么保证了logn的复杂度
- 红黑树为啥是有序的
- 简述红黑树插入一个值的过程
- deque的具体实现
- vector能不能放智能指针
- 迭代器失效vector和map举例,关系型和非关系型
- vector 扩容的原理
- 怎么回收vector的内存
- multimap的底层实现和map的区别
- 死锁和怎么解决死锁
- 自旋锁适合多核还是单核,在单核和多核分别存在什么问题
- fork的底层实现
- const有什么用处
- static的用法
- 四种转换
- struct 对齐及占用内存大小,为什么要对齐
- 进程切换和线程切换有什么区别
- 函数栈调用的具体过程讲讲,inline的具体讲讲,什么时候不能使用inline inline和宏定义
- class 空,普通class 带有虚函数的class 实例占用多大的内存
- 进程中的内存分配,进程中有几个栈,几个堆
- 虚拟内存的原理
- 堆内存的底层实现,谈到了内存池,讲讲内存池吧
- stl::sort() 排序算法,各种
- allocator的底层原理
- 各种内存是在哪一步进行的初始化,写时复制
- 传值,传指针,传引用的构造函数怎么调用的
- 构造函数,析构,移动,复制,赋值
- 右值的好处
- LRU算法口述
- 孤儿进程僵尸进程
- 线程同步与进程同步
- shm的原理,底层做了什么
- 栈帧指针的移动,mmap函数底层原理
手撕代码
单例模式(懒汉饿汉,常用的单例写法,写了三种,为啥是线程安全,内存屏障,violate)
链表排序 https://leetcode-cn.com/problems/7WHec2/ 要求时间复杂度小于o(n2),不得开辟vector然后排序再串起来的方案
反转链表 https://leetcode-cn.com/problems/UHnkqh/ 递归和不递归的做法
合并排序链表 https://leetcode-cn.com/problems/vvXgSW/ easy 不知道为啥是leetcode困难题
简单计算器 https://leetcode-cn.com/problems/calculator-lcci/ 手撕唯一一道做不出来的题
模板的特化与偏特化,就测测模板的基础编程
模板快排
模板实现数据结构
括号匹配 https://leetcode-cn.com/problems/valid-parenthesis-string/
多线程按顺序输出ABC n次 条件变量+unique_lock
多线程计算1+…+n
简单自旋锁atomic 实现CAS
记录最大值与最小值和平均值的队列(队列最大长度为n)
手撕生产者与消费者队列,差不多写出来了,但是被说没有很好的拆解,耦合度太高,时间太短了
手撕shared_ptr