Awesome
如下是C++后台研发技术路线以及知识点,这里有很多细节,还需要不断完善。
欢迎大家提交PR来一起完善这个知识库,成为contributor!
👉 如果你是编程零基础,或者想入门C++,推荐 【卡码网】C++基础课 👉 如果你有C++基础,想手写STL,推荐 【卡码网】手写简单版本STL(C++)
C++primer B站视频讲解
(玩命更新ing...)
编程语言C++
- C++primer5笔记代码资料
- volatile static const extern等关键字
- 宏定义和展开、内联函数区别
- 常用库函数实现
- STL原理及实现
- 虚函数的作用和实现原理,什么是虚函数,有什么作用?
- C++ 内存分配机制
- 指针
- override和overload的区别
- 写string类的构造,析构,拷贝函数
- C++中类成员的访问权限有那些?
- C++多态的实现有那几种?他们有什么不同?
- C++中右值引用有什么作用?
- 面向对象的三大特征是什么
- 静态分配内存和动态分配内存有什么区别?
- C++结构体内存对齐
- 讲一讲C++中的原子操作有那些?
- 简单说说STL中的优先级队列是如何实现的?
- C++中动态链接库和静态连接库的区别是什么?
- 在C++中,对一个对象先malloc后delete这样使用可以吗?有什么风险?
- 在C++中,三个全局变量相互依赖,程序应该如何初始化呢?300个呢?
- STL中的优先级队列是如何实现的?
- 如果拿到虚函数表的储存地址,是否可以改写虚函数表的内容?
- 在C++中为什么需要深拷贝,浅拷贝会存在哪些问题?
- 如何构造一个类使得只能在堆上或者栈上分配内存?
- 什么是C++的内存模型?
- 指针和引用在内存中的表现形式有何不同?
- 内存映射文件是什么?如何用它来处理大文件?
- C++中结构体内存布局的规则是什么?
- 在C++中,用堆和用栈谁更快一点?
- C++中struct和class有什么区别?
- 如果A这个对象对应的类是一个空类,那么sizeof(A)的值是多少?
- 如果A这个指针指向一个数组,那么sizeof(A)的值是多少?
- 如果A是某一个类的指针,那么在它等于nullptr的情况下能直接调用里面的A对应类里面的public函数吗?
- STL中一般都有那些常见的算法库呢?
- C++中,结构体可以直接赋值吗?
- #define和const的区别有那些?
- 在C++的map中,[]与insert有那些区别?
- 在32位和64位系统中,指针分别为多大?
- weak_ptr是如何解决shared_ptr循环引用的?
- 虚函数是否可以声明为static?
- 如何使用gdb来定位C++程序中的死锁?
- C++中常用的类优化技术有那些?
- C++的atomic<bool>代码底层是如何实现的?
- 原子变量的内存序是什么?
- 什么是左值?什么是右值?有什么不同?
- 什么是完美转发?
- C++中四种cast的转换?
- 内存池是什么?在C++中如何设计一个简单的内存池?
- STL中,map的底层是如何实现的?
- STL中,set的底层是如何实现的?
- set,mutiset,map,mutimap之间都有什么区别?
- 在C++的算法库中,find()和binary_search()有什么区别?
- lower_bound()和upper_bound()有什么区别?
- 为什么需要allocator?他在STL中有什么作用?
- 什么是RAII原则,他在STL是怎么应用的?
- STL容器是线程安全的吗?
- 什么是泛型编程,他在STL中是怎么使用的?
- 如何选择合适的STL容器
- 函数参数的入栈顺序是什么,从左到右还是从右到左?
- 讲讲函数调用的过程
- git的merge和rebase有什么区别?
数据结构与算法
- 数据结构与算法学习攻略
- 数组和链表的区别、适用场景
- 栈和队列的区别、适用场景
- 什么时候会产生栈溢出,为什么一直递归就会栈溢出
- 循环队列怎么实现
- 什么是二叉树、二叉搜索树、平衡二叉树、完全二叉树、满二叉树
- 二叉树和链表的区别
- 什么是哈夫曼树?构造过程?应用场景
- 什么是堆?如何维护堆
- 什么是红黑树?红黑树与平衡二叉树、B/B+ 树的区别
- 什么是跳表?跳表和平衡二叉树的区别
- 如何判断图中是否有环(拓扑排序)
- 时间复杂度和空间复杂度的定义?时间换空间 & 空间换时间的例子有哪些
- 常见排序算法及其时间复杂度、各种排序算法对比
- 内存有限,怎么对100亿数据进行排序(大数据小内存排序问题,答案不唯一)
- 如何判断某网页的URL是否存在于包含100亿条数据的黑名单上(大数据小内存去重问题,答案不唯一)
- 检查手机号是否存在于百万数据电话号中(答案不唯一)
- 内存有限,如何在20亿个整数中找到出现次数最多的数(答案不唯一)
- 内存有限,如何在 40 亿个非负整数中找到所有未出现的数(答案不唯一)
- 内存有限,如何在 100 亿数据中找到中位数(答案不唯一)
- 内存有限,如何在 2 亿个整数中找出不连续的最小数(答案不唯一)
设计模式
操作系统
- linux的内存管理机制,内存寻址方式,什么叫虚拟内存,内存调页算法,任务调度算法
- 锁:互斥锁,乐观锁,悲观锁
- 动态链接和静态链接的区别
- 常见的信号、系统如何将一个信号通知到进程
- linux系统的各类同步机制、linux系统的各类异步机制
- 如何实现守护进程
- 标准库函数和系统调用的区别
- 协程是什么,为什么需要协程
- 进程的状态转换有那些?
- 什么是进程?什么是线程?他们的区别是什么?
- 进程间的通信方式有那些?
- 线程间的通信方式有那些?
- 线程,进程和协程是否有自己独立的堆区和栈区?
- 什么是PCB?
- 分页和分段的区别是什么?
- 为什么有了进程还需要线程和协程?
- 外中断和内中断有什么区别?
- 什么是僵尸进程?
- 程序编译的过程
- 并行和并发的区别
- 什么是缺页中断
- 为什么用户态和内核态的相互切换过程开销比较大
- 介绍下分层存储体系和 CPU 三级缓存
- 为什么 CPU访问寄存器的速度比访问内存CPUCache 的速度快
- 固态硬盘和机械硬盘区别
- 操作系统本身为用户提供什么功能
- 什么是缓冲区溢出?
- 介绍下进程的地址空间(虚拟地址和物理地址)
- 一段代码从程序到执行经历怎么样的过程(程序在计算机中是如何运行起来的)
- 什么是页表、什么是快表
- 从本地读取一个文件通过网络发送到另一端,中间涉及几次拷贝
- 单线程怎么保证高并发?
- select/poll/epoll 分别讲讲
linux 服务器
计算机网络
数据库
- 谈谈数据库中索引的理解,索引和主键区别
- 现在普通关系数据库用得数据结构是什么类型的数据结构
- 索引的优点和缺点
- 关系型数据库和非关系数据库的特点
- 乐观锁与悲观锁的区别
- 数据库范式:第一第二第三范式
- 数据库日志类型作用
- B TREE 和B+TREE的区别
- union和join
- Innodb和Myisam的区别
- mysql架构是什么样的?
- 一条SQL语句在数据库框架中的执行过程
- 数据库中常见的锁都有哪些?
- 优化索引的办法有那些
- mysql为啥会产生死锁呢?如何避免他?
- 在Mysql中,数据要写入磁盘,redolog也要写入磁盘,为什么要多此一举?
- MySQL的行级锁有那些种类?
- mysql索引失效有哪几种情况?
- 数据库事务隔离级别有那些?
- mysql数据库中,产生的redolog都会直接写入磁盘吗?
- 数据库的ACID特性
- MySQL的主从复制是如何实现的?
- mysql的索引都有那些?
- Redis 有什么作用?为什么要用 Redis
- Redis 的底层数据结构有哪些
- 介绍 intset 及其升级过程,支持降级吗
- 介绍 SDS,Redis 为什么要使用 SDS 而不是 C 字符串
- 介绍 dict,什么是 rehash?什么是渐进式 rehash
- 介绍 ziplist,什么是连锁更新?quicklist、lispack
- 介绍 Redis 的 skiplist
- Redis 数据类型(对象)有哪些
- Redis String 原理和使用场景(分布式锁)
- Redis List 的原理和使用场景
- Redis Set 的原理和使用场景
- Redis ZSet 的原理和使用场景(延迟队列)
- 为什么 Zset 需要同时使用跳表和字典来实现?
- 为什么 Redis 使用跳表而不是红黑树来实现 Zset
- Redis Hash 的原理和使用场景
- Redis的HyperLogLog的原理和使用场景
- Redis的Bitmap的原理和使用场景
- Redis中Stream的原理和使用场景
- Redis中数据(键值对)是怎么存储的
- Redis如何判断键是否过期?过期键的删除策略有哪些
- Redis的key设定24h过期时间,那么24h后就一定会过期吗
- Redis内存淘汰策略
- Redis的两种持久化方式以及优缺点
- 为什么AOF后台重写和BGSAVE命令都用子进程而不是线程?
- Redis是单线程还是多线程?Redis6.0之后为何又引入了多线程
- Redis不是单线程吗,为什么会存在并发安全问题
- Redis单线程在多核机器里使用会不会浪费机器资源
- 讲一讲Redis主从复制
- 讲一讲Redis的哨兵
- 讲一讲Redis的集群
- Redis主从复制、哨兵、集群的区别
- 什么是一致性哈希,Redis集群为什么不用一致性哈希
- 如何解决Redis集群数据丢失问题(异步复制、集群脑裂)
- 介绍Redis事务(Redis能实现ACID吗)
- Redis缓存穿透问题及其解决方案
- Redis缓存雪崩问题及其解决方案
- Redis缓存击穿问题及其解决方案
- Redis的BigKey问题及其解决方案
- 如何解决缓存和数据库一致性问题
- Redis和Memcached的区别
- Redis为什么这么快
海量数据处理
- bitmap
- Map-Reduce原理
- BloomFilter原理
- Trie树原理
- LSM树原理
linux下操作命令以及工具
- 工作中常用的linux 命令
- 编译工具GCC
- 调试工具GDB
- 性能优化工具Perf
- 内存泄露检查工具Valgrind
- makefile编写
程序员求职
程序员的工具
工欲善其事必先利其器
适合新手的开源项目
- 联机五子棋(c实现)
- fileHttpServer(go语言实现)
- Sqlgen(shell脚本实现的批量操作mysql)
- 单机存储引擎(C++实现的跳表)
- NosqlAttack (python实现)
关于作者
大家好,我是程序员Carl,《代码随想录》作者,哈工大师兄,先后在腾讯和百度从事分布式技术研发。