这门课解决什么问题,适合什么基础
很多写过几年 C++ 的人,代码能编译能跑,但心里没底:类对象到底占多少字节、虚函数表指针放在对象头部还是尾部、编译器背着我们偷偷插入了哪些构造和拷贝调用、返回值优化到底在什么阶段生效。这门课就是拆这些底层账本,重点在对象模型与虚函数机制,不教语法也不讲标准库容器怎么用。它适合已经能独立写出带继承和虚函数的小项目、看过对象内存布局初步概念但讲不清楚的人。如果你连拷贝构造和赋值运算符的区别都还没理顺,建议先回去补基础,直接看这门课会卡在目标文件分析和程序转化语义那几节。
建议先看哪几块,资料怎么配合练习
资料包线索里能看到两条主线:一是对象布局与构造语义,二是虚函数表与继承关系下的手工调用。建议先啃对象所占空间、this指针调整、构造函数语义这三节,因为后面讲拷贝构造和程序优化时,默认你已经知道编译器会在什么时机合成默认构造、什么时候插入成员初始化列表代码。虚函数表指针位置分析那一节要自己写测试代码验证,别只看视频。练法很具体:每看完一节,自己写一个最小复现工程,用编译器选项导出目标文件,对照课程里分析的符号和布局,把成员变量顺序改一改、加虚函数去掉虚函数,看对象大小怎么变。资料里如果有示例工程,先别打开,自己敲一遍卡住了再对照。讲程序转化语义和优化的几节,必须开编译器优化选项,看汇编层级到底消除了哪些临时对象,否则等于白看。
学完能独立做什么
学完后你应该能回答几个硬问题:一个含虚函数的类对象比不含的多出几个指针、多继承下this指针怎么调整、编译器在什么条件下会拒绝优化掉拷贝构造、深浅拷贝在成员初始化列表里走的是哪条路径。落到实际工作上,你能看懂别人写的框架里那些奇怪的构造写法是不是在规避编译器合成行为,能定位对象布局不合理导致的内存浪费,能判断虚函数调用为什么没被内联。再往深走,看引擎源码里组件系统的继承设计、读标准库实现里的类型萃取,就不会被一层层模板和虚函数吓退。如果看完还是说不清对象模型里成员变量的排列规则和虚函数表在继承下的布局,那就是漏了,回头把目标文件分析那几节重看,别假装会了往下走。
课程目录
1-1 [c++对象模型探索 课程介绍] c++对象模型探索课程详细介绍 (37:32) 2-1 [对象] 类对象所占用的空间 (22:47) 2-2 [对象] 对象结构的发展和演化 (43:44) 2-3 [对象] this指针调整 (21:44) 2-4 [对象] 分析obj目标文件,构造函数语义 (36:03) 2-5 [对象] 构造函数语义续 (41:36) 2-6 [对象] 拷贝构造函数语义 (44:54) 2-7 [对象] 程序转化语义 (44:03) 2-8 [对象] 程序的优化 (45:50) 2-9 [对象] 程序优化续、拷贝构造续,深浅拷贝 (40:00) 2-10 [对象] 成员初始化列表说 (59:11) 3-1 [虚函数] 虚函数表指针位置分析 (16:54) 3-2 [虚函数] 继承关系作用下虚函数的手工调用 (33:14) 3-3 [虚函数] 虚函数表分析 (51:07) 3-4 [虚函数] 多重继承虚函数表分析 (32:15) 3-5 [虚函数] 辅助工具,vptr、vtbl创建时机 (18:21) 3-6 [虚函数] 单纯的类不纯时引发的虚函数调用问题 (59:16) 4-1 [数据语义学] 数据成员绑定时机 (26:35) 4-2 [数据语义学] 进程内存空间布局 (25:35) 4-3 [数据语义学] 数据成员布局 (42:10) 4-4 [数据语义学] 数据成员存取 (34:22) 4-5 [数据语义学] 单一继承下的数据成员布局 (37:36) 4-6 [数据语义学] 单类单继承虚函数下的数据成员布局 (29:16) 4-7 [数据语义学] 多重继承数据布局与this调整深谈 (51:13) 4-8 [数据语义学] 虚基类问题的提出和初探 (42:42) 4-9 [数据语义学] 两层结构时虚基类表内容分析 (50:01) 4-10 [数据语义学] 三层结构时虚基类表内容分析 (37:40) 4-11 [数据语义学] 成员变量地址、偏移、指针等重申 (36:43) 5-1 [函数语义学] 普通成员函数调用方式 (22:38) 5-2 [函数语义学] 虚成员函数、静态成员函数调用方式 (44:21) 5-3 [函数语义学] 虚函数地址问题的vcall引入 (17:55) 5-4 [函数语义学] 静动态类型、绑定,坑点,多态体现深谈 (47:57) 5-5 [函数语义学] 单继承虚函数趣味性测试和回顾 (22:49) 5-6 [函数语义学] 多继承虚函数深释、第二基类,虚析构必加 (01:06:43) 5-7 [函数语义学] 多继承第二基类虚函数支持、虚继承带虚函数 (34:03) 5-8 [函数语义学] RTTI运行时类型识别回顾与存储位置介绍 (43:02) 5-9 [函数语义学] 函数调用、继承关系性能说 (39:14) 5-10 [函数语义学] 指向成员函数的指针及vcall进一步谈 (47:26) 5-11 [函数语义学] inline函数回顾和扩展细节说 (22:50) 6-1 [对象构造语义学] 继承体系下的对象构造步骤 (48:43) 6-2 [对象构造语义学] 对象复制语义学、析构函数语义学 (45:59) 6-3 [对象构造语义学] 局部对象、全局对象的构造和析构 (40:29) 6-4 [对象构造语义学] 局部静态对象、对象数组构造析构和内存分配 (47:26) 6-5 [对象构造语义学] new、delete运算符,内存高级话题 (20:23) 6-6 [对象构造语义学] new、delete的进一步认识 (38:37) 6-7 [对象构造语义学] new细节,重载类内operator new、delete (01:06:17) 6-8 [对象构造语义学] 内存池概念、代码实现和详细分析 (01:02:46) 6-9 [对象构造语义学] 嵌入式指针概念及范例、内存池改进版 (01:00:56) 6-10 [对象构造语义学] 重载全局new、delete,定位new及重载等 (53:51) 6-11 [对象构造语义学] 临时性对象的详细探讨 (51:18) 7-1 [对象模型之巅] 模板及其实例化详细分析 (01:05:16) 7-2 [对象模型之巅] 邪门歪道、推荐书籍、结束语 (42:33)





