上篇
C++演进简史(C++11、14、17)
Bjarne简介,C++缘起,C++的优势和不足,ISO C++,C++98,C++03,C++11,C++11的目标,“看起来像新的语言”,C++14概要,C++17概要,C++20,VC11,VC13,VC15,VC17和VC19,Clang,编译器技术的革新
30min
数学天才和STL(C++11)
基本问题,模板容器,Alexander Stepanov,标准化,源代码,STL的演进,std::array,GDB下观察STL容器,STL的调试问题,冗长的调试符号,“显示的都是什么鬼?”,pretty printer,GDB7,在GDB中观察STL容器的问题和解决方法。
30min
选择STL容器的性能考虑(C++11、14、17、20)
对象组织,向量和链表比较,std::string_view,std::span,在调试器下看数据布局,插入和删除操作,性能差异
30min
匿名的原因和方法(C++11)
问题,回调,排序,future,匿名函数的写法,函数对象,std::function,值捕获,引用捕获,隐式捕获,表达式捕获,auto参数,自动名字,在GDB中理解匿名函数,给匿名函数设置断点
30min
异常处理和noexcept(C++11)
背景,C++异常处理,throw关键字,栈展开,对象展开,noexcept的用途,如果声明了noexcept还抛异常会怎么样,noexcept的性能影响,案例实践
30min
智能指针的智慧(C++11)
问题,ATL和传统解决方法,make_shared,make_unique,std::shared_ptr,,std::unique_ptr,std::weak_ptr传递对象,对象复制,传递引用,案例代码实践,在GDB中理解智能指针
30min
线程库基础(C++11)
多线程编程的跨平台问题问题,C++11的线程库,std::thread,可变参数,在调试器下观察线程的创建和启动过程
30min
同步对象(C++11)
std::mutex,std::unique_lock,std::future,std::packaged_task,std::condition_variable,同步对象,同步对象的性能差异
30min
STL迭代器和自动类型声明(C++11、14)
vector, list, 模板容器的数据布局,stl迭代器,std::begin和std::end,用作循环变量,range-for,用作迭代器,decltype ,auto的其它用法
30min
自动类型识别(C++11、14)
背景,typedef,typeid,使用场景,decltype,decltype(auto),代码示例
30min
共计:5小时
下篇
右值引用和移动语义(C++11)
问题,左值引用和右值引用,移动语义,左值转化为右值,隐式移动,转发,在调试器中观察隐式移动,性能影响
30min
移动语义与性能优化(C++11)
对象复制,隐式复制,隐式复制的性能开销,移动语义的作用
30min
类的特殊方法(C++11)
默认构造函数,析构函数,拷贝构造函数,拷贝赋值运算符,移动构造函数,移动赋值运算符,显示删除,=delete和=default带来的好处,在调试器中观察移动赋值方法的使用
30min
内存对齐(C++11)
内存拓扑,CPU的cache结构,cache line,内存对齐的重要性,数据结构对齐,alignas,动态分配对齐,std::aligned_alloc,DPDK代码分析和实践
30min
空指针的前世今生(C++11)
简史,从NULL到nullptr,nullptr与NULL的区别,使用场景,深层原理,调试时的价值
30min
命名空间(C++11、14、17)
长名字还是段名字,名字冲突,命名空间的解决之道,使用场景,现代C++的扩展,对调试的影响
30min
有常和无常(C++11、14、17、20)
Const的问题,constexpr,constexpr与const的区别,constexpr变量,constexpr函数,constexpr构造函数,常量虚函数,constexpr if-statements,编译和调试
30min
强类型枚举(C++11)
传统枚举类型的问题,强类型枚举的使用方法,:type,在调试器中观察强类型枚举的类型和数据
30min
元组和结构化绑定(C++11、14、17、20)
返回多个值,std::tuple,在调试器中观察多元组,std::tie,用std::tie实现批量赋值,使用std::ignore占位,C++17引入的结构化绑定,绑定到原生数组,绑定到类对象,std::optional,std::nullopt
30min
变参模板(C++11、14、17、20)
背景,C++11的可变参数模板,示例,形参包展开,sizeof...运算符,递归计算,C++17引入的折叠表达式,using声明,C++20的改进
30min
共计:5小时
BACKUP/备选
STL算法库(上)
排序,分区,重排,倒转
30min
STL算法库(下)
集合操作,查找算法,搜索算法,正则表达式, std::regex,std::regex_match,std::match_results,使用场景
30min
函数对象
概念,functor,实质,使用场景,工程应用,STL的函数对象
30min
内存分配器
基本问题,分配器的一般模式,早已有之,STL的内存分配器
30min
属性声明
背景,元数据,__attribute__,标准化,现代C++定义的标准属性,nodiscard
30min
可能和不可能
现代CPU和分支预测,预测失败的惩罚,Linux和GCC的实践,标准化,likely 和unlikely
30min
预处理器
背景,工程需要,非标准化的解决方法,标准化,__has_include
30min
模板编程
问题,泛型,带来的好处,工程上的问题,使用场景,现代C++的支持和优化
30min
线程本地存储
TLS,TLS的传统方法,Windows API,Linux上的实现,thread_local,对操作系统的依赖,编译器实现
30min
多线程调试
GDB的多线程命令,观察线程,针对一组线程执行命令,使用GDB调试多线程死锁和理解同步对象
30min
三向比较运算符(C++20)
他山之石,背景,C++20,返回类型,编译器支持,自动生成的代码,在调试器中观察三向比较运算符
30min
课程对象
已经有C++语言编程基础的软件工程师,或者相关项目的测试工程师、项目带头人和技术经理。