本书是一部介绍C++对象模型知识的书,意在探究C++幕后的秘密,讲述C++编译器的故事。内容涉及很多不被常人所知的C++对象内部工作原理以及底层的一些具体实现机制方面的知识。 本书共分为7章: 第1章介绍书中范例所涉及的演示环境搭建、如何创建基本的C++程序,以及对程序进行跟踪和断点调试的方法。 第2章的主题是对象,包括以对象所占内存大小为讲解切入点详述对象结构的发展和演化; 构造、拷贝构造、移动构造函数语义; 深浅拷贝、成员初始化列表等内容。 第3章的主题是虚函数,包括虚函数表指针、虚函数表的概念和细节; 更进一步涉及多重继承的虚函数表分析和各种辅助工具的讲解。 第4章的主题是数据语义学,包括类中的数据成员布局、数据成员存取,涉及单一继承、单类单继承、多重继承等情况下的数据成员布局;
第1章演示环境介绍和准备
1.1演示环境搭建说明
1.2创建最基本的能运行的C++程序
1.3Visual Studio中程序的调试方法
第2章对象
2.1类对象所占用的空间
2.2对象结构的发展和演化
2.3this指针调整
2.4分析obj(目标文件)与构造函数语义
2.5拷贝构造函数语义与移动构造函数语义
2.5.1拷贝构造函数语义
2.5.2移动构造函数语义
2.6程序转换语义
2.6.1定义时初始化对象
2.6.2参数的初始化
2.6.3返回值初始化
2.7程序的优化
2.7.1从开发者层面的优化
2.7.2从编译器层面的优化
2.8程序优化续、拷贝构造函数续与深浅拷贝
2.8.1程序优化续
2.8.2拷贝构造续
2.8.3深浅拷贝
2.9成员初始化列表
2.9.1何时必须用成员初始化列表
2.9.2使用初始化列表的优势
2.9.3初始化列表的细节探究
第3章虚函数
3.1虚函数表指针位置分析
3.2继承关系作用下虚函数的手工调用
3.3虚函数表分析
3.4多重继承虚函数表分析
3.5辅助工具与vptr、vtbl创建时机
3.5.1使用辅助工具查看虚函数表
3.5.2虚函数表的创建时机
3.6单纯的类不纯时引发的虚函数调用问题
第4章数据语义学
4.1数据成员绑定时机
4.1.1成员函数函数体的解析时机(整个类定义完毕后)
4.1.2成员函数参数类型的确定时机(最近碰到原则)
4.2进程内存空间布局
4.3数据成员布局
4.3.1观察成员变量地址规律
4.3.2边界调整与字节对齐
4.3.3成员变量偏移值的打印
4.4数据成员的存取
4.4.1静态成员变量的存取
4.4.2非静态成员变量的存取
4.5单一继承下的数据成员布局
4.6单类单继承虚函数下的数据成员布局
4.6.1单个类带虚函数的数据成员布局
4.6.2单一继承父类带虚函数的数据成员布局
4.6.3单一继承父类不带虚函数的数据成员布局
4.7多重继承数据布局与this调整深谈
4.7.1单一继承数据成员布局this指针偏移知识补充
4.7.2多重继承且父类都带虚函数的数据成员布局
4.8虚基类问题的提出和初探
4.8.1虚基类(虚继承/虚派生)问题的提出
4.8.2虚基类初探
4.9两层结构时虚基类表内容分析
4.9.1虚基类表内容之5~8字节内容分析
4.9.2各种形式的继承
4.9.3虚基类表内容之1~4字节内容分析
4.10三层结构时虚基类表内容分析与虚基类设计原由
4.10.1三层结构时虚基类表内容分析
4.10.2虚基类为什么这样设计
4.11成员变量地址、偏移与指针等重申
4.11.1对象成员变量内存地址及其指针
4.11.2成员变量的偏移值及其指针
4.11.3成员变量指针和不指向任何成员变量的成员变量指针
第5章函数语义学
5.1普通成员函数调用方式
5.2虚成员函数与静态成员函数调用方式
5.2.1虚成员函数调用方式
5.2.2静态成员函数调用方式
5.3虚函数地址问题的vcall引入
5.4静动态类型、绑定、坑点与多态体现深谈
5.4.1静态类型和动态类型
5.4.2静态绑定和动态绑定
5.4.3继承的非虚函数坑
5.4.4虚函数的动态绑定
5.4.5重新定义虚函数的缺省参数坑
5.4.6C++中的多态性
5.5单继承虚函数趣味性测试和回顾
5.5.1单继承下的虚函数
5.5.2回顾和一些小试验
5.6多继承虚函数深释、第二基类与虚析构必加
5.6.1多继承下的虚函数
5.6.2如何成功删除用第二基类指针new出来的子类对象
5.6.3父类非虚析构函数时导致的内存泄露演示
5.7多继承第二基类虚函数支持与虚继承带虚函数
5.7.1多重继承第二基类对虚函数支持的影响(this指针调整作用)
5.7.2虚继承下的虚函数
5.8RTTI(运行时类型识别)回顾与存储位置简介
5.8.1RTTI(运行时类型识别)简单回顾
5.8.2RTTI实现原理
5.8.3vptr、vtbl与RTTI的 type_info信息创建时机
5.9函数调用与继承关系性能
5.9.1函数调用中编译器的循环代码优化
5.9.2继承关系深度增加,开销也增加
5.9.3继承关系深度增加,虚函数导致的开销增加
5.10指向成员函数的指针和vcall
5.10.1不用类对象能否调用类的虚函数和普通成员函数
5.10.2指向成员函数的指针
5.10.3指向虚成员函数的指针和vcall
5.10.4vcall在继承关系中的体现
5.11inline函数回顾和扩展
5.11.1inline函数回顾
5.11.2inline扩展
第6章对象构造语义学
6.1继承体系下的对象构造
6.1.1对象的构造顺序
6.1.2虚函数
6.1.3构造函数中对虚函数的调用
6.2对象复制语义学与析构函数语义学
6.2.1对象的默认复制行为
6.2.2拷贝赋值运算符与拷贝构造函数
6.2.3如何禁止对象的拷贝构造和赋值
6.2.4析构函数语义
6.3局部对象、全局对象的构造和析构
6.3.1局部对象的构造和析构
6.3.2全局对象的构造和析构
6.4局部静态对象、对象数组构造析构和内存分配
6.4.1局部静态对象的构造和析构
6.4.2局部静态对象数组的内存分配
6.5new、delete运算符与内存高级话题
6.6临时性对象的详细探讨
6.6.1拷贝构造函数相关的临时性对象
6.6.2拷贝赋值运算符相关的临时性对象
6.6.3直接运算产生的临时性对象
第7章模板实例化语义学
7.1模板及其实例化详细分析
7.1.1函数模板
7.1.2类模板的实例化分析
7.1.3多个源文件中使用类模板
7.2炫技写法
7.2.1不能被继承的类
7.2.2类外调用私有虚成员函数
后记
猜您喜欢
评论