CppMaster
C++ Master Learning Roadmap, especially for AIoT and C++ advanced SWE
Install / Use
/learn @Charmve/CppMasterREADME
🌍 English | 简体中文| 日本語 | Українською <br>
<div align="center"> <!-- <a href="https://charmve.github.io/L0CV-web"> <img src="https://github.com/Charmve/CppMaster/blob/main/src/header.svg" width="50%" alt="Click to see the more details"> </a> --> <a href="https://charmve.github.io/L0CV-web"> <img src="src/one-logo.jpg" width="36%" alt="Click to see the more details"> </a> <br> <p>C++ Master Learning Roadmap <a href="https://charmve.github.io/CppMaster"><sup><i><b>Hot</b></i></sup></a></p> <p align="center" alt="CircleCI"> <a href=""> <img alt="Actions Status" src="https://github.com/danielbayerlein/dashboard/workflows/CI/badge.svg"> </a> <a href="https://codecov.io/github/richelbilderbeek/travis_qmake_gcc_cpp11_boost_test_gcov?branch=master"> <img src="https://codecov.io/github/richelbilderbeek/travis_qmake_gcc_cpp11_boost_test_gcov/coverage.svg?branch=master" alt="codecov.io"> </a> <a href="https://google.github.io/styleguide/cppguide.html"> <img alt="Cpp Style Guide" src="https://img.shields.io/badge/code_style-standard-brightgreen.svg"> </a> <a href=""> <img alt="Docs Released" src="https://img.shields.io/badge/docs-released-green.svg"> </a> <a href=""> <img alt="Dependencies" src="https://img.shields.io/badge/dependencies-up%20to%20date-red.svg"> </a> </p> <p align="center"> <a href="https://github.com/Charmve/CppMaster/tree/main/code">Quickstart</a> • <a href="https://github.com/Charmve/CppMaster/tree/main/notebooks">Notebook</a> • <a href="https://github.com/Charmve/CppMaster/issues">Community</a> • <a href="https://charmve.github.io/CppMaster/">Docs</a> </p> </div><b>Note: Please raise an issue for any suggestions, corrections, and feedback.</b>
The goal of this repo is to buid a advanced C++ programing tech stack for a higher salary.
<br>Waking-Up
大多数人都高估了他们一天能做的事情,但低估了他们一年能做的事情
<b><details><summary>💡 关于</summary></b>
📚 本仓库是面向 C/C++ 技术方向校招求职者、初学者的基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息。
💡 侧边目录支持方式:📚 Docsify 文档、Github + TOC 导航(TOC预览.png)
📄 保存为 PDF 方式:使用 Chrome 浏览器打开 <a href="https://charmve.github.io/CppMaster/">📚 Docsify 文档</a> 页面,缩起左侧目录-右键 - 打印 - 选择目标打印机是另存为PDF - 保存(打印预览.png)
🙏 仓库内容如有错误或改进欢迎 issue 或 pr。由于本人水平有限,仓库中的知识点有来自本人原创、读书笔记、书籍、博文等,非原创均已标明出处,如有遗漏,请 issue 提出。本仓库遵循 CC BY-NC-SA 4.0(署名 - 非商业性使用 - 相同方式共享) 协议,转载请注明出处,不得用于商业目的。
</details><a href=""><img align="right" alt="Go for it!" src="src/i_magic_box.png" height="260" title="Do what you like, and do it best!"/></a>
Table of Content
- ⭐️ JD Cases
- ➕ C/C++
- 💻 操作系统
- ☁️ 计算机网络
- 💾 数据库
- 📏 设计模式
- 🐳 容器化技术
- 🔱 C/C++ 发展方向
- 📝 面试题目经验
- 📚 书籍
- 👍 内推
- 👬 贡献者
- 📜 License
<br>
⭐️ JD Cases
| | | |
|--|--|--|
|
|
|
|
|
|
|
|
|
|
| |
➕ C++
问题列表,详细解答可参考: C++面经汇总
1、面向对象的三大特性:封装、继承、多态
2、类的访问权限:private、protected、public
3、类的构造函数、析构函数、赋值函数、拷贝函数
4、移动构造函数与拷贝构造函数对比
5、深拷贝与浅拷贝的区别
6、空类有哪些函数?空类的大小?
7、内存分区:全局区、堆区、栈区、常量区、代码区
https://blog.csdn.net/m0_37202877/article/details/126243403
8、C++与C的区别
9、struct与class的区别
10、struct、union 内存对齐
11、new/delete与malloc/free的区别
12、内存泄露的情况分析
13、sizeof与strlen对比
14、指针与引用的区别
- C语言的指针和引用和c++的有什么区别?
15、野指针产生与避免
16、多态:动态多态、静态多态
17、虚函数实现动态多态的原理、虚函数与纯虚函数的区别
https://johnysswlab.com/the-true-price-of-virtual-functions-in-c/
18、继承时,父类的析构函数是否为虚函数?构造函数能不能为虚函数?为什么?
19、静态多态:重写、重载、模板
20、static关键字:修饰局部变量、全局变量、类中成员变量、类中成员函数
- C 语言的关键字static和 C++ 的关键字static有什么区别
21、const关键字:修饰变量、指针、类对象、类中成员函数
22、extern关键字:修饰全局变量
23、volatile关键字:避免编译器指令优化
- 一个参数可以既是const又是volatile吗
24、四种类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
25、C++11 部分新特性,比如右值引用、完美转发等
-
什么是右值引用,跟左值又有什么区别?
-
完美转发
26、std::move函数
27、四种智能指针及底层实现:auto_ptr、unique_ptr、shared_ptr、weak_ptr
28、shared_ptr中的循环引用怎么解决?(weak_ptr)
- shared_ptr 和 unique_ptr
29、vector与list比较
- vector的底层原理
- list的底层原理
- vector中的reserve和resize的区别
- vector中的size和capacity的区别
- vector中erase方法与algorithn中的remove方法区别
- 正确释放vector的内存(clear(), swap(), shrink_to_fit())
- vector迭代器失效的情况
- 什么情况下用vector,什么情况下用list,什么情况下用 deque
30、priority_queue的底层原理
31、STL部分容器的实现原理,如 vector、deque、map、hashmap、set、list
- map与unordered_map对比
- set\map机制
- map 、set、multiset、multimap的底层原理
- map 、set、multiset、multimap的特点
- 为何map和set的插入删除效率比其他序列容器高
- 为何map和set每次Insert之后,以前保存的iterator不会失效?
- 当数据元素增多时(从 10000 到 20000),map的set的查找速度会怎样变化?
- 为何map和set的插入删除效率比其他序列容器高,而且每次insert 之后,以前保存的iter
- 为何map和set不能像vector一样有个reserve函数来预分配数据?
- set的底层实现实现为什么不用哈希表而使用红黑树?
- hash_map与map的区别?什么时候用hash_map,什么时候用map?
32、set与unordered_set对比
33、STL容器空间配置器
- 📦 STL,
- STL线程不安全的情况
34、变量的声明和定义有什么区别
35、简述strcpy、sprintf与memcpy的区别
36、请解析(*(void (*)( ) )0)( )的含义
37、设置地址为0x67a9的整型变量的值为0xaa66
38、简述指针常量与常量指针的区别
39、请你来说一下 C++ 中struct和class的区别
40、简述#ifdef、#else、#endif和#ifndef的作用
41、typedef和define有什么区别
- 写一个 “标准”宏MIN
42、写出int 、bool、 float、指针变量与 “零值”比较的if语句
43、结构体可以直接赋值吗
44、谈谈你对拷贝构造函数和赋值运算符的认识
45、sizeof和strlen的区别
46、关键字 override
- 简述类成员函数的重写、重载和隐藏的区别
47、C++ 自己实现一个String类
48、用两个栈实现一个队列的功能
49、高级数据结构
- 红黑树
- B B+树
- 图
50、编译链接机制、内存布局(memory layout)、对象模型
参考书籍:《C++ Primer》(第5版)、《STL源码剖析》、
<a href="https://charmve.github.io/sponsor.html" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-red.png" alt="Buy Me A Coffee" width="150" ></a>
<br>性能优化

from: https://www.brendangregg.com/ebpf.html
https://cloud.tencent.com/developer/article/2134930
主要聚焦在多线程(CPU)、内存(Memory)的优化上,以冯·诺依曼体系结构为参考。
深入理解 Cache 工作原理 CPU Cache 机制以及 Cache miss
Nvidia Xavier/Orin
高性能计算
- CUDA 并行编程模型及常用优化方法,熟悉基于 TensorRT 编程方法;
- 熟练掌握CUDA程序性能分析、问题定位及调试的能力,掌握对应 CUDA 工具的使用;
- 熟悉 PTX/SASS,有编译优化经验;
- OpenCL & Cuda
- 模型推理 TensorRT、ONNXRuntime
💻 操作系统
1、进程与线程区别
2、线程同步的方式:互斥锁、自旋锁、读写锁、条件变量
3、互斥锁与自旋锁的底层区别
4、孤儿进程与僵尸进程
5、死锁及避免
6、多线程与多进程比较
7、进程间通信:PIPE、FIFO、消息队列、信号量、共享内存、socket
8、管道与消息队列对比
9、fork进程的底层:读时共享,写时复制
10、线程上下文切换的流程
11、进程上下文切换的流程
12、进程的调度算法
13、阻塞IO与非阻塞IO
14、同步与异步的概念
15、静态链接与动态链接的过程
16、虚拟内存概念(非常重要)
17、MMU地址翻译的具体流程
18、缺页处理过程
19、缺页置换算法:最久未使用算法、先进先出算法、最佳置换算法
参考书籍:《Unix环境高级编程》、《Linux多线程服务器端编程》
文件系统
I/O
内存管理
虚拟内存
共享内存
进程和线程
多线程/线程池
时间轮转片
Socket问题合集
Linux
vim
git
git原理:
其本质上是一个key-value的数据库加上默克尔树形成的有向无环图(DAG)
https://www.jiqizhixin.com/articles/2019-12-20
常用使用方法:

常用命令:
1、执行命令git checkout br_rename_old //切换到br_rename_old分支 (如果已经在这个分支下,可以不执行此步骤)
2、执行命令git pull origin br_rename_old //将代码更新到和远程仓库一致
3、执行命令git branch -m br_rename_old br_rename_new //将本地仓库的br_rename_old的名称修改为br_rename_new
4、执行命令git push origin --delete br_rename_old //将远程分支br_rename_old删除
5、执行命令git push --set-upstream origin br_rename_new //将本地分支push到远程仓库
6、修改最近一次的commit信息 git commit --amend
7、git cherry-pick <commitHash>
8、更新子模块 git submodule update --init --recursive
9、删除远程分支 git push origin --delete <branch_name>
⚙️ 编译、链接与调试
- [链接问题合集](https://github.com/Charmve/CppMast
