新書推薦:
《
建安:官渡大决战(196—200)
》
售價:HK$
53.9
《
权力的图像——近代的中国海图与交流
》
售價:HK$
184.8
《
中亚民族史
》
售價:HK$
184.8
《
人工智能与智能制造:概念与方法 [美]马苏德·索鲁什 [美]理查德·D.布拉茨
》
售價:HK$
140.8
《
中平:东汉王朝大崩溃(184—189)
》
售價:HK$
53.9
《
基于鲲鹏的分布式图分析算法实战
》
售價:HK$
108.9
《
中国历史研究入门(全二册)
》
售價:HK$
283.8
《
夺回大脑 如何靠自己走出强迫
》
售價:HK$
65.8
|
編輯推薦: |
书中主题: C对象知识:对象结构的发展及演化、所占空间、各种构造函数的语义等、成员初始化列表等。 C虚函数:虚函数表、虚函数表指针、多重继承虚函数表分析、辅助工具介绍等。 C数据语义:数据成员布局和存取、多种继承关系下数据成员的布局、多层继承结构时虚基类表内容分析、this指针调整等。 C函数语义:成员函数调用方式、静态动态绑定、多态性体现、虚析构函数成因剖析、inline函数详解等。 C对象构造语义:对象构造顺序、对象复制及析构语义、局部和全局对象的构造与析构,临时对象、模板实例化等。 环境标准: 程序可以运行在Visual Studio、g编译环境。书中全部实例通过Visual Studio 2019编译环境演示、部分实例也通过g进行差异化演示。
|
內容簡介: |
本书是一部介绍C对象模型知识的书,意在探究C幕后的秘密,讲述C编译器的故事。内容涉及很多不被常人所知的C对象内部工作原理以及底层的一些具体实现机制方面的知识。 本书共分为7章: 第1章介绍书中范例所涉及的演示环境搭建、如何创建基本的C程序,以及对程序进行跟踪和断点调试的方法。 第2章的主题是对象,包括以对象所占内存大小为讲解切入点详述对象结构的发展和演化; 构造、拷贝构造、移动构造函数语义; 深浅拷贝、成员初始化列表等内容。 第3章的主题是虚函数,包括虚函数表指针、虚函数表的概念和细节; 更进一步涉及多重继承的虚函数表分析和各种辅助工具的讲解。 第4章的主题是数据语义学,包括类中的数据成员布局、数据成员存取,涉及单一继承、单类单继承、多重继承等情况下的数据成员布局; 二层、三层结构时虚基类表内容、与this指针调整等问题。 第5章的主题是函数语义学,包括普通成员函数、虚函数、静态成员函数调用方式; 静态、动态绑定以及多态性的详细体现分析和析构函数必须是虚函数原因的着重解释; 多重继承第二虚基类详谈、RTTI实现原理、inline函数细说等内容。 第6章的主题是对象构造语义学,包括对象构造顺序,对象复制、析构函数语义; 局部、全局对象的构造和析构,临时对象详细探讨等内容。 第7章的主题是模板实例化语义学,重点对模板的实例化进行了详细的分析。 这是一本C进阶类图书,要求学习者具备一定的C开发基础,适合作为C编程人员的参考读物。
|
關於作者: |
王健伟:男,1976年9月生,网名狂想(KuangXiang),1995年毕业于哈尔滨工程大学计算机及应用专业,拥有20多年软件开发经验,参与开发过数十个实际项目,涉及网络通信、网络安全、网络游戏等领域,具备极其深厚的软件开发实战经验。曾参与创办深圳知名网络安全公司安络科技有限公司,是中国首套网络安全在线扫描评估系统项目负责人、全球同服独立游戏《冒险之路》制作人。
|
目錄:
|
第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类外调用私有虚成员函数
后记
|
內容試閱:
|
本书是在读完了笔者的《C新经典》一书后,建议阅读的第二本有关C的书,是一本足以颠覆你以往许许多多认知的书,一本你绝不应该错过的书。
章节主题概要
C对象模型知识久负盛名,在C界具有很高的美誉度,这方面知识的学习更是被诸多颇具开发实力的行业前辈倾力推荐!
这本书的内容涉及很多不被常人所知的C对象内部工作原理、底层的一些具体实现机制方面的知识,探究C幕后的秘密,讲述C编译器的故事。这是一本提高个人C开发修养,练习C编程内功的图书,定位为进阶类C图书,这意味着本书的学习难度很高,需要学习者有中高级C开发基础,也意味着书中的知识是想成为C高级开发者甚至大师级开发者必须掌握的。
如果你想成为一名既会开车又会修车的老司机,如果你在C面试中不想丢掉进入世界级大公司的机会,如果你想挑战一些有难度的技术,或者希望晋级、成长为C高手甚至大师,C对象模型方面的知识是必学的。
在读者对C对象模型有了一个笼统和宽泛的概念后,就可以进一步了解C对象模型研究的是哪方面知识了。
读者都知道,C是一门支持面向对象程序设计的语言,而面向对象程序设计的三大特性是封装性、继承性、多态性。这些特性都需要系统内部(底层)的支持。C编译器在程序员的背后默默地做了很多事情,例如,生成类对象时调用类的构造函数、释放类对象时调用类的析构函数; 当系统认定需要某些成员函数(如拷贝构造函数)而程序员没有定义该成员函数时,编译器会自动合成出该成员函数等。
本书研究的就是系统内部都做了哪些事情,面向对象三大特性中的继承性和多态性的具体实现细节是怎么样的,实现起来开销如何等。既然是针对对象模型方面知识的研究探索,那么基本都是围绕类、对象来讨论问题。
如果按照正常的学习C语言开发的学习旅程来说,可以不学这些知识,或者说也学不到这些知识,所以,笔者通过写这本书,专门讲解这方面的知识。
C对象模型方面知识的掌握对于无形中提高程序员自身整体素质会起到一种非常关键的作用。本书定位为一本C进阶图书,针对C初学者和仅希望用C应付普通开发的人,并不合适。但是,如果读者想成为大家公认的C开发高手甚至C专家或者大师级的人,C对象模型知识是必需的。或者换句话说,这本书主要针对C编程经验比较丰富并希望进一步提高自己的认知,希望进一步了解系统底层细节的中高级C程序员。
阅读本书的基础要求
阅读本书要求熟练掌握C98(传统C)标准,如对类、对象、继承、虚函数、虚基类等概念都要有比较清晰的了解和认识,希望读者至少用过1~2年C,当对自身的能力进行比较客观的评估时,认为自己能够达到中级应用水平之后,再开始看这本书。如果读者认为自己当前的知识积累还不太够,那么建议先把基础的C语言知识学好,然后再阅读本书才更加合适。
在此,强烈推荐笔者所著的《C新经典》一书,这是一本不可多得的打C语言编程基础的书。
本书面向的读者
这本经典、有趣并能带给读者意想不到精彩知识的书,适合有以下几种意愿的读者:
(1) 希望提升自身C开发内功。
本书能够在很大程度上拓展读者的眼界和思路,让读者了解在C语言之下,C编译器究竟做了什么。通过认真研读本书,读者的认知层次、能力、对自己C编程的自信心都会提升一大截,请读者认真体会这种感受。
(2) 希望在面试中获得良好表现。
很多大公司C开发岗位的面试会问及对象模型方面的知识(读者不妨看一看以往中国三个著名互联网公司(BAT)的C面试题),例如,一个不包含任何成员的空类,sizeof值是多少?C如何通过虚函数表实现多态?一个对象访问普通成员函数和虚函数哪个更快?在什么情况下,析构函数需要是虚函数?等。如果面试者此前从未接触过这方面的知识,很可能无法给出正确答案,从而直接导致丢掉这份工作机会。
(3) 希望获得成就感。
当听到别人夸赞自己或者自身表现更加突出的时候总会产生成就感,这种成就感也是让自己不断前进的最佳动力。对象模型方面的知识就是那种容易让人产生这种感觉的知识。掌握对象模型知识的人,也往往更容易成为他人眼中高大上的牛人。
本书特色
C对象模型这个概念,并不是所有人都非常熟悉。但笔者相信,熟悉的人一定都读过《深度探索C对象模型》,这是一本在C界颇受赞誉的书,也正是借着这本书,C对象模型这个概念被广大读者慢慢熟悉。
C对象模型方面的知识比较分散,也比较抽象,理解起来有一定的难度。《深度探索C对象模型》是一本让人敬畏的书,出版至今已有20年,读过的人对它有着很高的评价。虽然瑕不掩瑜,但这本书的缺点也很突出: ①语言晦涩,难以理解; ②偏重理论,缺乏实践验证。这也让很多学习者望而却步或读完后一知半解,并未有特别大的收获,成为了很多学习者心中的遗憾。
很久以前,笔者就想写一本专门讲解C对象模型知识的书,但因各种原因未能成行,终于在不久前狠下决心,放下手头一切工作,集中精力做这件事。在本书中,使用大量的图解、范例代码进行演示,参考大量资料并将笔者多年一线开发实战经验的积累和体会融入书中,生动和全方位地阐述C对象模型的魅力所在,极大地降低学习者的理解和掌握门槛,相信凡是参与本书学习的C从业者,都会有一种由表及里整体实力、信心的全方位提升的感受,而作者本人,在写这本书的过程中,也有一种自身往更高层次迈进的喜悦之感!
翻看目录,本书从一个类对象所占用的内存空间大小为突破口讲起,涉及的主题包括对象、虚函数、数据语义学、函数语义学、对象构造语义学、模板实例化语义学等,每一章的内容都非常精彩,既长知识,又开眼界。目录的组织结构笔者参考了《深度探索C对象模型》一书,因为觉得以这种目录组织结构讲述问题的难度比较适中,学习顺序也比较合理。
大量学习过设计模式这个话题内容的读者,总是感觉学完设计模式后不会运用,说到根上,设计模式本身考验的是抽象思维能力,找出设计中的易变部分用虚函数去实现,就是如此简单。而在本书中,对虚函数的工作原理和过程有着非常深入的探讨。所以,通过本书的阅读,对于读者学习向来比较晦涩的设计模式类知识,也将会有着妙不可言的好处!
在成书的过程中,笔者尽最大努力通过网络寻找一切对本书有用的资料,尽量不遗漏任何重要的知识,笔者的心愿是通过自己的表达把这些知识更通俗地传达给读者,可能让读者只花费以往15甚至110的力气就能获得同等甚至更高质量的知识。书中没有哪个内容是笔者自己独创的,都是参考了大量资料,经过实践和整合,付出了数月的时间和极大的心血而写成的。在这里,笔者发自内心地感谢诸多CC前辈在这个行业中多年的耕耘及对知识的积累和传播,感谢你们对他人的奉献。
本书阅读进度
不排除有基础和学习速度特别快的读者可以很快把本书的内容阅读完毕并掌握得很好,但通常来讲,笔者建议本书的阅读速度如下:
整本书一共48节(如1.1这样的标题算一节),笔者建议大概每周平均学习两节。对于上班的读者,可以尽量将学习时间安排在晚上和周末,对于学习速度较快的读者,可以每周学习更多节数。整本书的学习难度比较平均。笔者认为每周学习两节还是能够做到的,这意味着整本书大概需要160天的阅读时间,如果加快学习进度,每周能学习三节,读者可以立争在100天(3个月多一点)左右时间内将本书读完。
在阅读过程中,极其强烈地推荐读者跟着笔者一起实践书中的每个范例,验证范例的正确性。实践是加深知识理解和掌握的一个极其重要、不可省略的过程,这样的学习效果将比只用耳朵听和用眼睛看要强3~5倍。千万不要偷懒,既然决定走程序开发这条路,现在的勤奋就是为了让自己以后少一些被动和困境。
本书内容全是重点,没有非重点,建议读者将整本书全部仔细地读完,一节都不要错过。通过这样仔细地阅读,本书包含哪些内容,在读者心中就会有一个比较深刻的印象,此时,这本书就可以当作读者的贴身伙伴和工具书了忘记了哪个知识点,随时翻开查阅。
对于知识点千万不要死记硬背,随着读者学习知识的增多,会面临着学过的知识很快忘记的情形。这很正常,所以在大多数情况下,我们的头脑里往往只记录一个知识点的大概思路和解决方法的索引(位置),需要解决类似问题的时候能找到这个位置,通过查阅资料来解决问题就非常好。
运行环境
本书的范例全部在Windows操作系统下的Visual Studio 2019集成开发环境下调试通过。笔者之所以选择这个开发环境,是因为它对开发者相当友好,开发和调试程序特别方便,极大地简化了学习难度。
书中详细阐述了在Windows操作系统下安装Visual Studio 2019的过程与进行程序调试的方法。
根据讲解需要,笔者也会在Linux操作系统下进行一定的程序演示操作(使用g编译程序)。基本上,书中所有范例都可以跨操作系统平台运行(既可以在Windows操作系统下运行,又可以在Linux操作系统下运行)。
资料获取
本书有完整的配套学习资料(源码),读者可以免费获取。获取方法如下:
(1) 查找并关注程序员速成或人工智能科学与技术微信公众号。
(2) 在微信公众号中,输入对象模型四个字,就可以获取配套学习资料下载链接。
读者评论
笔者在出版本书之前,有数月的时间,通过网络推出本书所讲述的内容,收到了大量学习者的反馈和极高的评价,99%的评论都是五星好评。这里摘录一部分评论留言:
王老师牛。
看过的最好的系列教程,没有之一。
很好,感觉自己的C能力上升了一个层次。
课程很好的,就算以前学过的人也值得买来复习一遍,很棒的课程,期待实战课。
只有学了才知道好的课程。
这课程让我长了不少见识。
跟着老师学了很多课了,一直跟下来,感觉收获特别多。
老师的课程讲得非常好!让我学到了以前从来没学到的东西,例如,this指针调整偏移、虚函数表指针等!让我更深地认识到C在背后做了哪些事情!
课讲得很有激情,也很细,学到了以前很多不了解的知识!
功力深厚的老师,无话可说,大写的厉害,说的非常详细,理解得很深入,期待老师其他的课程。
致谢
20几年前,笔者写过一本《Crystal Reports水晶报表设计与开发实务》,这本书的写作实在是太辛苦,通宵达旦,熬了有3个多月,每天大概要写到后半夜3点才能休息。书稿完成之后,整个人瘦了好几圈。
虽然该书有一定的销量,但是跟付出感觉不成比例。所以,从那时候开始,笔者就暗下决心,从此以后再也不写书了。
人算不如天算,2018年下半年,笔者通过网络,逐步发布一些CC类网络课程,让人意外的是,这些课程获得了学员极好的口碑,隐隐有超越市面绝大多数CC类课程的趋势。在这个时候,清华大学出版社电子信息教材事业部主任、首席策划盛东亮先生找到笔者,希望笔者能够写一套优秀的CC类图书。
因为多年前出书的辛劳产生的心理阴影,笔者当时本能地拒绝了写书这件事,但在笔者的心里却从此埋下了一颗写书的种子。
几个月之后,笔者终于想通了写书这件事,有两点好处:
(1) 帮助更多的读者掌握更多的C开发知识,这是为笔者自己增加福报,也是为社会尽一点自己的微薄之力,做一个对社会有用的人。
(2) 扩大自己的知名度,增加收入。毕竟,笔者也需要养家,通过自己的劳动赚取收入,这是光荣的。
当笔者把出书的想法说给盛东亮先生听的时候,他非常高兴并与笔者做了深入的沟通,我们二人年纪相仿,聊得很投机,在写书这件事情上观点也非常一致希望这是一本高质量的、经典的C图书,是一本可以摆在书架上10年甚至20年的书籍。我相信,读者从书名中也能感受到笔者对这本书的期盼。
在出书的交流过程中,盛东亮先生给予了笔者相当多的支持与鼓励,甚至可以说,如果不是盛东亮先生当初的接洽,如果不是后续顺畅愉快的交流,如果不是许多实际的工作都能在最短的时间敲定并逐一落实,这套书也许根本不会出现在读者面前。所以,这份感谢,笔者要送给你盛东亮先生。
C知识体系庞杂,而C对象模型方面的知识又具有一定的深度和难度,限于水平,虽然笔者非常尽心尽力,但书中错误在所难免,恳请各位读者不吝指教。
编著者2019年8月17日
|
|