深度探索c++对象模型

合集下载

学习C语言必看书籍

学习C语言必看书籍

一部分大概与大学课程:计算机组成原理、计算机系统结构、汇编
等等相关,就是较浅地讲了讲组原、系统结构、汇编的内容,说
浅,是因为这本书讲的绝对没有课上讲的深。第二部分讲了链接、
虚存等等。第三部分讲了些应用的东西。这书是CMU的导论性质的
课的教材。个人最喜欢程序的机器级表示和虚拟存储器这两章。另
外,这本书和操作系统也基本上没关系,对比一下操作系统教材和
可以作为学习C的第二本书
C++语言
C缺陷和陷阱
可以作为学习C的第三或第四本书
C专家编程
可以作为学习C的第三或第四本书
数组与指针的艺 术
C语言深度解剖
supermegaboy写的。不错。 程正冲 编著,石虎 审阅。
C99标准
有问题时查一查,很多问题可迎 刃而解。
C的初级读物。如果读过C与指 彻底搞定C指针 针,可忽略。
阅读材料
有些书,想读。可惜现在没有时间 。只能断断续续的读。在淘宝上 找了个卖盗版书的店,因为价格比正版便宜很多,所以买了很多。 先放在桌子上,有时间再读。
1: C++ Primer中文版第四版。好好学这本书,秒杀趋势
华为中兴的笔试的C++部分。没有C语言基础的人,C++ Primer Plus 或许是更好的选择。
深入理解计算机 系统英文版
好书
深入理解计算机 系统中文版
好书
专业相关的东西:
计算机协议的 设计与验证
比较专业的东西,英文的,design and validation of computer protocols,学过计算机网络,TCP/IP再看 应该没有问题。第八章讲的是有限状态机,不错

深入探索C++对象模型

深入探索C++对象模型

探索C++对象模型第一章关于对象C语言中,“数据”和“处理数据的操作”十分开来的。

由一组“分布在各个一功能味道想得函数中”的算法所驱动,他们处理的是共同的外部数据。

而在C++中,则使用的是独立的“抽象数据类型abstract data type(ADT)”所驱动。

从软件工程的角度看“一个ADT或CLASS hierar5chy的数据封装”比"在C程序中程序迎的使用全局数据好"。

加上封装后的布局成本C++在布局以及存取时间上的额外负担是由Virtual引起,包括:Virtual function 机制用以支持一个有效率的执行期绑定"runtime bingding"Virtual base class 用以实现“多次出现在继承体系中的baseclass,有一个单一而被共享的实体”1.1 C++ 对象模型 (the c++ object model)在C++中,有两种class data members : static and nonstatic; 三种class member function :static , nonstatic and virtual。

而这些内容的安排方法有:1 简单对象模型为了尽量减低C++编译器的设计复杂度,配上了空间和执行期的效率。

一个object 是一系列的slots,每一个slot之想一个member : data member and function slot. 每个data member and function member都有自己的slot. 此模型中,meember 不放在object中,而是存放slot,由slot指向member.2 表格驱动对象模型此模型中将data member放在一个表中,member function放在一个表中,而class object 本身还有两个表哥的指针.表中的每一个单格存放data member 和member function。

《深度探索C++对象模型》笔记

《深度探索C++对象模型》笔记

《深度探索C++对象模型》笔记本⽂为《深度探索C++对象模型》笔记:1、对象模型1.1、简单对象模型1.2、表格驱动数据模型1.3、c++ 对象模型1.3.1、类对象中的 string 类型1.3.2、多态与切割2、default constructor2.1、copy constructor2.1.1、bitwise copy2.2、NRV - named return value 优化2.3、initialization list 和 constructor2.4、constructor 的扩充2.5、constructor 的执⾏顺序2.5.1、vptr 必须被设⽴的情况2.6、destructor2.7、临时对象3、empty virtual base class optimism4、指针存取和对象存取 members 的差异4.1、static members4.1.1、命名冲突4.2、class members4.2.1、多重继承4.3、dynamic_cast5、new & delete5.1、野指针5.2、继承类 delete 的问题5.3、placement operator new6、template1、对象模型1.1、简单对象模型⼀个对象是⼀系列的 slot,每个 slot 指向按顺序声明的 member。

⼤⼩为:指针⼤⼩ * member 个数1.2、表格驱动数据模型数据与函数分离。

object 为指向两表的两个指针。

1.3、c++ 对象模型nonstatic data members 置于 object 内,⽽ static data/function 和 nonstatic function 置于其外。

virtual function 采⽤ vtbl(virtual table) 存储,object 内⽤ vptr(virtual pointer) 指向 vtbl。

《深度探索C++对象模型》读书笔记第5章构造结构拷贝语意学

《深度探索C++对象模型》读书笔记第5章构造结构拷贝语意学

《深度探索C++对象模型》读书笔记:第5章构造、结构、拷贝语意学64位平台C/C++开发注意事项在/en/l/上例出了28个在64位平台上使用C/C++开发的注意事项,对于进入64位时代的程序员应该去看看这28个事项,这些英文读物对于有C/C++功底的朋友读起来应该并不难,我估计大约20-30分钟可以精读完一篇(或者更快),下面是这28个注意事项的列表。

相信对大家一点有帮助。

Lesson 01. What 64-bit systems are. Lesson 02. S本章主要讲述了一下内容:虚函数、纯虚函数的声明,无继承情况下的对象构造,继承体系下的对象构造,对象复制语意学,对象的功能,解构语意学。

虚函数、纯虚函数的声明部分对应P191~P195之间的内容,主要讲述了如下内容:ClassAbstract_base{public:virtual~Abstract_base()=0; virtualvoidinterface()const=0; virtualconstchar*mumble()const {return_mumble;}protected:char*_mumble;};1. 本类缺少一个构造函数。

为什么本类需要一个构造函数呢?因为需要初始化_mumble。

2. 一个纯虚函数可以有实现。

虽然是可以但是本人认为在本例中给出一个纯虚函数的实现来是很令人费解的;因为纯虚函数一般是在基类声明接口用的,只有子类才需要实现这个函数。

3. 什么样的函数需要是虚的呢?结合书中所述和本人自己的理解,只有一个函数可能因为类型(注意是类型而是类,类型与类的区别《设计模式》一书第一章有说明)不同而有不同实现是需要声明成虚拟的。

4. 什么函数需要是纯虚函数呢?在接口中声明的函数,做为基类的类中的可能因为类型不同而有不同实现的函数。

5. 关于虚函数中的const问题。

我的意见和数中一致,只有在确定需要const的时候再加。

c++ 学习路线与推荐书籍

c++ 学习路线与推荐书籍
个人认为真正想学习C的人,看清楚了,真正想学习C的人啊,不是路过的人,应该看一下《C primer plus》,这本书有些罗嗦,但是讲的很全面,可以当字典使用。
3.API
这部分的话,其实是慢慢积累的,你去Google查一下什么是API就好了,学习Windows原理的时候你会理解到是个什么东西的,大概说起来就 是微软给我们提供了一些封装好了的函数,我们可以调用过来实现一些简单而且常用的功能,比如MessageBox是弹出一个窗口,你只要在他的参数里自己 设定大小啊和现实什么啊就是了。
我的看法是:如果你不理解其中的条款,记忆,并且照做;如果你理解其中的条款,我猜你一定会同意书中的观点。我认为这本书中的内容至少在2009年以前都不会过时,人们将广为传诵它制定的101条戒律。
还不知道他的简称,也许“101”会成为一个候选者?
提到《Effective C++》,那么另外三本书一一浮出水面:
你对C++不满吗?这本书可以部分地帮你完成抱怨的目标。也许它还可以让你不迷信C++。
最后,一份C++标准文档也是应该加以咀嚼的。
还有一些书籍,并不能简单的归于C++,也难以在纯粹的书本学习中加以掌握。《Design Patterns》/《设计模式》一书就归于此类。
所有上述的书籍,要么谈论C++语言本身,要么谈论STL的,要么兼而有之(当然严格讲STL也是C++语言非常重要的一部分)。偶尔,某些书中条目也会涉及实际工程。这些书并不是C++软件开发的全部,但是他们很重要。阅读这些书,未必需要化费太多的精力,有时候是会困难,但也有时候会很快速。
这本书及其中文版传言好坏都有,没有认真看过,不做评价,如果确有兴趣,不妨尝试一下该书。

深入理解C++对象模型

深入理解C++对象模型

深⼊理解C++对象模型 C++对象模型是⽐较重要的⼀个知识点,学习C++对象的内存模型,就可以明⽩C++中的多态原理、类的初始化顺序问题、类的⼤⼩问题等。

1 C++对象模型基础1.1 C++对象中都有哪些东东C++对象中包括以下内容:静态常量成员变量成员函数虚函数纯续函数...以下是⼀个对象的定义:class Base{static int b_s;public:void function() { }virtual void v_function() {cout << "Base v_function()" << endl;}private:int b_a;int b_b;};1.2 ⼀个C++对象有多⼤ 假如使⽤Base类作为测试,那Base类在内存中占⽤⼏个字节呢?window7 vs2013测试结果:centos7 64位 vim测试结果: 通过以上两个测试结果图分析可知,⼀个类的占⽤内存⼤⼩由以下成员决定:其⾮静态成员的总和⼤⼩加上任何由于对齐的需求⽽填补(padding)上去的空间如果类中只有⾮静态成员,⽐如char c; 则其⼤⼩为1。

如果除了char c;外,还有int a; 则其⼤⼩为8加上为了⽀持virtual⽽由内部产⽣的额外负担1.3 C++中⼀些重要的语法糖静态常量整数成员(double就不⾏)在class内部直接初始化静态成员只能在类外初始化,且初始化时不加static基类够构造函数中调⽤virtual函数实际调⽤的是基类中的virtual函数(这点和Java不同)const成员函数:不修改类成员数据2 C++对象内存布局测试代码如下:#include <iostream>using namespace std;class Base{static int b_s;public:void function() { }virtual void v_function() {cout << "Base v_function()" << endl;}int b_a;int b_b;};int Base::b_s = 0;int main(int argc, char **argv){Base base;base.b_a = 1;base.b_b = 2;cout << "size: " << sizeof(base) << endl;int *p = (int *) &base;cout << *p << endl;p++;cout << *p << endl;p++;cout << *p << endl;system("pause");return0;}输出结果为: 输出结果中的1和2为类中b_a和b_b成员的值,11459700表⽰⼀个地址,改地址包含有虚表的信息。

深度探索c++对象模型

深度探索c++对象模型

深度探索c++对象模型深度探索c++对象模型第一章:关于对象1. c++没有什么天生的比c庞大和迟缓。

加上封装后的布局成本(layout costs for adding encapsulation)以及额外存取时间主要由virtual引起1.1 virtual function 机制,用以支持一个有效率的”执行期绑定”1.2 virtual base class 机制,用以实现多次出现在继承体系中的base class有一个单一而被共享的实体2. c++对象模型(c++ object model) 相比简单对象模型和表格驱动对象模型的优势和坏处。

其主要坏处是让编译时间来替换执行时间,是可取的2.1 每个class都有相应的virtual table来存储virtual function 指针2.2 每个class object都被隐式的添加了一个vptr指向class的virtual table,用于RTTI的type_info object也被关联进virtual table中3. 关键词的差异struct和class,策略性正确的struct3.1 用于c的struct中的伎俩(如当struct当作数组用)未必可行,要视编译器对protected和private定义前后位置3.2 c struct在c++中的一个合理用途就是在传递一个class object的部分(或全部)到一个c函数中去时,使用struct组合于class可以有效的解决4. 对象的差异,ADT等于abstract data type model,觉得可以称之为基于对象以区别面向对象, OO等于object-oriented module4.1 ADT (又称OB)和OO是很不一样的,只有OO中virtual才能体现出威力。

两者互用是危险的,使用OB来表达OO,容易造成数据被截切(sliced)4.2 体现OO的唯一方法是通过带有virtual function的(指针)对象。

C 对象详解

C  对象详解

C++对象详解C++对象模型详解何为C++对象模型?引用《深度探索C++对象模型》这本书中的话:有两个概念可以解释C++对象模型:语言中直接支持面向对象程序设计的部分。

对于各种支持的底层实现机制。

直接支持面向对象程序设计,包括了构造函数、析构函数、多态、虚函数等等,这些内容在很多书籍上都有讨论,也是C++最被人熟知的地方(特性)。

而对象模型的底层实现机制却是很少有书籍讨论的。

对象模型的底层实现机制并未标准化,不同的编译器有一定的自由来设计对象模型的实现细节。

在我看来,对象模型研究的是对象在存储上的空间与时间上的更优,并对C++面向对象技术加以支持,如以虚指针、虚表机制支持多态特性。

文章内容简介这篇文章主要来讨论C++对象在内存中的布局,属于第二个概念的研究范畴。

而C++直接支持面向对象程序设计部分则不多讲。

文章主要内容如下:虚函数表解析。

含有虚函数或其父类含有虚函数的类,编译器都会为其添加一个虚函数表,vptr,先了解虚函数表的构成,有助对C++对象模型的理解。

虚基类表解析。

虚继承产生虚基类表(vbptr),虚基类表的内容与虚函数表完全不同,我们将在讲解虚继承时介绍虚函数表。

对象模型概述:介绍简单对象模型、表格驱动对象模型,以及非继承情况下的C++对象模型。

继承下的C++对象模型。

分析C++类对象在下面情形中的内存布局:单继承:子类单一继承自父类,分析了子类重写父类虚函数、子类定义了新的虚函数情况下子类对象内存布局。

多继承:子类继承于多个父类,分析了子类重写父类虚函数、子类定义了新的虚函数情况下子类对象内存布局,同时分析了非虚继承下的菱形继承。

虚继承:分析了单一继承下的虚继承、多重基层下的虚继承、重复继承下的虚继承。

理解对象的内存布局之后,我们可以分析一些问题:C++封装带来的布局成本是多大?由空类组成的继承层次中,每个类对象的大小是多大?至于其他与内存有关的知识,我假设大家都有一定的了解,如内存对齐,指针操作等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

深度探索c++对象模型第一章:关于对象1. c++没有什么天生的比c庞大和迟缓。

加上封装后的布局成本(layout costs for adding encapsulation)以及额外存取时间主要由virtual引起1.1 virtual function 机制,用以支持一个有效率的”执行期绑定”1.2 virtual base class 机制,用以实现多次出现在继承体系中的base class有一个单一而被共享的实体2. c++对象模型(c++ object model) 相比简单对象模型和表格驱动对象模型的优势和坏处。

其主要坏处是让编译时间来替换执行时间,是可取的2.1 每个class都有相应的virtual table来存储virtual function指针2.2 每个class object都被隐式的添加了一个vptr指向class的virtual table,用于RTTI的type_info object也被关联进virtual table中3. 关键词的差异struct和class,策略性正确的struct3.1 用于c的struct中的伎俩(如当struct当作数组用)未必可行,要视编译器对protected和private定义前后位置3.2 c struct在c++中的一个合理用途就是在传递一个class object的部分(或全部)到一个c函数中去时,使用struct组合于class可以有效的解决4. 对象的差异,ADT等于abstract data type model,觉得可以称之为基于对象以区别面向对象, OO等于object-oriented module4.1 ADT (又称OB)和OO是很不一样的,只有OO中virtual才能体现出威力。

两者互用是危险的,使用OB来表达OO,容易造成数据被截切(sliced)4.2 体现OO的唯一方法是通过带有virtual function的(指针)对象。

除此之外,所有的信息都可以在编译期决定而非运行期5.一个class object需要多少内存?要考虑的是一下三个方面5.1 其nonstatic data members的总和大小5.2 加上任何由于alignment的需要而填补上去的空间5.3 加上为了支持virtual而由内部产生的任何额外负担(overhead)注:我想带有virtual function的OB对于虚函数的调用也是由编译期决定的,而非运行期。

这使得inline virtual function是有效的(见书第一章最后页)。

*** C++是一门相当混杂的面向对象语言。

Stl类库的存在是OB的特性最好解释(除所有的stream类除外)。

OO部分都要靠指针和引用来体现,但是指向的实体肯定和对象在何种内存中无关(栈、堆)。

第二章构造函数语意学6.编译器并不是总是合成default constructor (同理copy constructor, assignment),只有在编译器需要的时候才会合成构造函数等。

Nontrivial default constructor就是编译器所需要才合成出来的函数。

6.1 带有default constructor的member class object6.2 带有default constructor的base class6.3 带有一个virtual function的class6.4 带有一个virtual base class的class不在上述4个中的而又没有声明任何constructor的class,意味着它们拥有的是implicit trivial default constructors,实际上并不会被合成出来。

7. copy constructor的构建操作7.1 default memberwise initialization, 一个良好的编译器可以为大部分class objects 产生bitwise copies,因为它们有bitwise copy semantics。

7.2 bitwise copy semantics(位逐次拷贝)是指声明展现了 default copy semantics,因而编译器不需要合成拷贝构造函数出来8.不要bitwise copy semantics的条件8.1 当class内含一个member object而后者的class声明了一个copy constructor 时8.2 当class继承自一个base class而后者存在有一个copy constructor时8.3 当class声明了一个或多个virtual functions时8.4 当class派生自一个继承串链,其中有一个或多个virtual base classes时9. 程序转化语义学***在严谨的c++用词中,“定义”是指“占用内存”的行为。

通过copy constructor的优化包含了多个方便,主要在:9.1 明确的初始化,使得对象初始化是通过拷贝构造得来9.2 参数的初始化9.3 返回值的初始化10. 编译器层面的优化以及NRV, NRV的实现有赖于copy constructor的提供。

Copy constructor的应用会导致编译器多多少少会对程序代码做部分转化。

11.成员的初始化队伍,必须使用member initialization list的四个理由:11.1 当初始化一个 reference member时11.2 当初始化一个const member时11.3 当调用一个base class的constructor,而它拥有一组参数时11.4 当调用一个member class的constructor,而他拥有一组参数时member initialization list处理可能重新排序,以体现出其声明次序!。

!第三章 data 语意学12. Class object的大小跟下述因素有关:12.1 语言本身所造成的额外负担(overload),如语言因支持virtual base class导致的额外负担12.2 编译器对于特殊情况所提供的优化处理,比如对于空类(没有members)实体大小为1byte,但是其子类中将毫无体现。

这在类库中常被用到。

12.3 alignment的限制,为了使bus的传输效率最高,而使processor而定的数据对齐优化13. Member的绑定,global object与class member的声明次序问题伴随着c++ reference manual---对于member functions本身的解析,会直到整个class的声明都出现了才开始。

然而这对于member function的argument list并不为真,,argument list中的名称还是会它们第一次遭遇时被适当地决议(resolve)完成。

因此在extern和nested type names之间的非直觉绑定操作还是会发生。

---防御性风格来避免此类问题,始终把nested type“声明”放在class的起始处。

……………… Page 91.14.Data member的布局(layout),c++ standard要求,在同一个access section (public,protected,private)中,members的排列只需满足“较晚出现的members在class object的较高的地址”,相邻member之间未必连续。

15.Data member的存取15.1 static data members,经由member selection operators(也就是….‟运算符)对一个static data member进行存取操作只是语法上的一种便宜行事而已。

Static data member 解决名字冲突的方法叫name-mangling.(Page 97).15.2 nonstatic data member,以….‟来析取与…->‟ 析取有无不同要视该member以及class对结构而定,….‟对member data的析取总是高效的,当然排除操作….‟的是引用对象。

15.3 继承与data member,简单继承结构中存取member跟c struct并无分别,这里的重点是c++语言保证出现在derived class中的base class object有其完整原样性!15.4 加上多态后data member数据内存布局会变得复杂,但是存取会变量仍旧是直接和快速的15.5 多重继承data member数据内存布局更为复杂,但是对于data member偏移的计算还是由编译器决定,因而仍旧是高效快速的15.6 虚拟继承,derived class object的指针(或者引用)向一个virtual base class 数据时,对该数据的存取都需要额外的一次指针跳转,这是对数据存取的唯一一处需要跳转后才能存取的地方--------当然这和15.5都是指有进取性的编译器而言(page 128的数据显示一般编译器未必如此)。

16. 指向data member的指针对于class的(非class object)nonstatic data member的取地址返回的总是data member的偏移量。

---其值对于各个编译器来说是不一样的17. 指向member的指针的效率问题,它取决于编译器对data member offset的实现以及编译器的优化能力第四章 function语意学18. Member的各种调用方式18.1 nonstatic member functions,nonstatic member function至少和一般的nonmember function有相同的效率。

实际上每个member function都是要内化为nonmember function:18.1.1 改写函数的signature(指函数原型)以安插一个额外的参数调用18.12 将每一个对nonstatic data member的存取改为由this指针来存取18.1.3 将一个member function重新改写成一个外部函数,对其名称要进行所谓的”mangling”处理,以使其成为独一无二的语汇。

18.2 名称的特殊处理(name mangling),对于member都名称一般会加上class name,无论是nonstatic member function 还是data member。

对于member function更会把参数类型也编码进去以区别重载的函数。

相关文档
最新文档