`
daojin
  • 浏览: 697304 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

深入探索C++对象模型学习笔记2

 
阅读更多

密码管理请下载:

http://a.app.qq.com/o/simple.jsp?pkgname=com.wa505.kf.epassword

 

1.   关于对象

1.1.  虚表:

1.1.1.       每一个class在编译时期产生一堆指向Virtual函数的指针. 并且放在表格中.[由于虚表定义在与类有关的静态数据区域,因此,一定是在编译时期完成].与此同时,classRTTI也放入了第一个slot.

 

1.2.  指向虚表的指针:

1.2.1.       每一个ClassObject被添加一个指针vptr.这个指针在运行时(构造函数,copy构造函数, 赋值运算符), 被指向对应的虚表, 当然了,这个虚表也包含RTTI信息.

1.3.  C++以以下方法支持多态.

1.3.1.       将一个子类指通过赋值操作符,  转换为父类指针.

1.3.2.       通过虚函数机制.

1.3.3.       通过dynamic_cast typeid运算符。

2.   构造函数语义学

2.1.    Default Constructor的建构操作

2.1.1.       带有Default ConstructorMember Class Object

2.1.2.       带有Default ConstructorBase Class

2.1.3.       带有Virtual Function cass

2.1.4.       带有一个Virtual Base Class class

2.2.   Copy Constructor的建构操作

2.2.1.       Bitwise Copy Semantics

2.2.2.       不要Bitwise Copy Semantics!的四种情况与 Default Constructor类似。

2.2.3.       重新设定Virtual Table(不能Bitwise Copy).

2.2.4.       重新处理Virtual Base Class Subobject. 因为在不同的同一继承层次的子类中,vbtr的值是不同的(不能Bitwise Copy).

2.3程序转换语意学Program Transformation Semantics

2.3.1          明确的初始化操作(Explicit Initialization)。重写定义,并明确调用copy构造

2.3.2          参数的初始化(隐式初始化)。除了初始化之外,还修改函数的签名。(老版本的BorlandC++没有修改)

2.3.3          返回值的初始化(Return Value Initialization.

改写函数签名,改为通过参数来返回。例如foo(A& a)

2.3.4          用者层面做优化(Optimization at the user Level使用者通过一些设计来优化代码。例如可以节约一次默认构造。

2.3.5          编译器优化:节约一次copy构造。但是有可能会破坏程序作者的意图,例如,如果基于copy构造做了一些事情,那么就可能会报错。对于直接返回一个值的函数。例如

A foo(){

A a; 

a.f();

return a};

首先改造为

Foo(A& a){

          a.A::A()

a.f()

a.A::A(a)

}

然后优化掉copy构造(C++标准是允许的)

Foo(A& a){

               a.A::A()

a.f()

}

2.3.6          Copy Constructor:要还是不要?

当编译器提供NRV优化时,最好还是提供一个。这样在大量的基于成员的初始化memberwise(与Bitwise相对)时,可以激活NRV

2.4成员们的初始化队伍(Member Initialization List

2.4.1          初始化一个reference member

2.4.2          初始化一个constmember

2.4.3          BaseClass 的构造函数没有默认构造时,需要一组参数。

2.4.4          MemberClass的构造函数没有默认构造时,需要一组参数

2.4.5           另外,初始化的次序由member的生命次序决定,不是由,初始化列表中的次序决定。最好避免在初始化列表中,用一个member为另外一个member设定初值。如果以member来初始化baseclass,那么问题将会更加严重。

Member Initialization List的执行顺序可能会因为插入新的代码而打乱。如果以member来初始化baseclass,或者memberclass

 

 

3.   Data语意学(The Semantics of Data

1.       DataMember的绑定, inline函数延迟绑定类成员与全局变量的绑定顺序。

特殊的typedef,经过VC++验证,不会使用延迟绑定(与深度探索这本书有出入)。

2.       Datamember的布局:编译器加入一些字段vptrvbtr等,字节对齐策略。

3.       字节对齐策略,VC++上为1.数据成员对齐规则:对齐方式n pragma pack(n)
1.     成员起始地址对齐:就是说变量存放的起始地址的偏移量:min(sizeof(类型),对齐方式n)或其倍数.

2.     整体对齐规则:结构的总大小也有个约束条件:
min(最大的sizeof(类型),对齐方式n)的倍数.

4.       继承与DataMember

继承,多态,多重继承,都不会产生效率问题。而虚拟继承,由于在编译阶段,不能通过指针类型直接判断对象的位置,因此必须采用间接法。会增加额外的调用负担。多态会增加一个vfptr,虚拟继承会增加一个vbptr,同时,虚拟继承也会使得Virtual Base Class的实体在整个继承体系中仅有一个。

5.       对象成员的效率。(虚拟继承下效率较差,其他相同)

在继承模型中,单一继承效率最高,一层的虚拟继承次之,而多层的虚拟继承效率最差。

6.       指向Members指针。

指向Member的指针实际上是,它所在的SubOjbect(相对与Object)中的offset位置。

7.       指向Members指针的效率。(虚拟继承下效率较差,其他相同)

与虚拟继承甚至继承体系都没有关系。但是,如果是虚拟继承,在访问点,与访问对象成员一样,只有在运行时才能决定Virtual Base Class Object的地址。因此通过访问指向Member的指针来访问Member,其效率与访问成员对象相同。

4.   Function语意学(The Semantics of Function

4.1   Member的各种调用方式

   非静态成员,signature函数原型的修改,增加对成员的访问语义,名称的特殊处理,

虚拟成员函数,通过vfptr在运行时调用。因为单凭借一个指针的值和类型,无法确定对象的vftable的地址。

静态成员函数,由于没有this指针,因此不能为虚函数,constvolatile。不需要经过class

Object 调用。不能访问nonstatic members

4.2   Virtual Member Functions

         不管是单一继承和多重继承,如果没有VirtualMemberFunctionVirtual Base Class,那么在编译期就能判断函数的位置。因此没有效率上的负担。

         单一继承时,如果有VirtualMemberFunction, 就会转换为一个间接的访问,因此会增加效率上的负担。Ptr->vptr[4](ptr)

多重继承时,效率问题发生在第二以及后继的带有Virutal Member Function的类上。由于在调用的时候通过thunk技术调整this指针,但是无法在编译阶段知道一个类是否是多重继承中的第二或者后继的基类,因此,必须在运行时,对此进行特殊处理。

虚拟继承下的虚拟函数Virutal Member Function

效率问题非常大,不但有可能要调整this指针,而且访问Virtual Base Class都需要延迟到运行时才可以。

效率排名:

Inline member>Nonmember friend=Static Member=NonStaticMember>virtual member>virtualmember(多重继承)&&VirtualMember(虚拟继承)> VirtualMember(虚拟继承+多重继承)

4.3   指向Member Function的指针:

       效率排名:

Nonmember = Member > NonVirtual(多重继承)> NonVirtual(虚拟继承)&&VirtualMember(单一继承)>多重继承 virtual &&虚拟继承virtual

       不同点在于多重继承,影响到了效率。由于需要对虚拟机制进行兼容性处理,增加了一些判断代码。其中的&&代表,未知

 

1
2
分享到:
评论

相关推荐

    深度探索C++对象模型读书笔记

    ### 深度探索C++对象模型读书笔记 #### 一、引言 在深入探讨C++对象模型之前,我们先来明确一个概念——什么是C++对象模型?...在未来的学习和工作中,继续深入探索C++的奥秘将是不断进步的动力。

    《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    通过阅读《深度探索C++对象模型》的学习笔记,我们可以更深入地理解C++的底层机制,这对于成为一名精通C++的开发者来说是必不可少的。同时,结合《Effective C++》的学习,可以让我们写出更加高效、健壮的C++代码。...

    深度探索C++对象模型(笔记)

    在深入探讨C++对象模型这一主题时...通过深入学习C++对象模型,我们可以更好地理解C++底层的工作原理,从而编写出更高效、更健壮的代码。无论是对于C++初学者还是资深开发者,理解对象模型都是提升编程技能的关键步骤。

    深度探索C++对象模型_读书笔记1

    《深度探索 C++对象模型》是一本深入剖析C++内部机制的著作,它揭示了C++如何在内存中表示和管理对象,以及由此产生的性能影响。通过对C++对象模型的了解,程序员可以编写出更高效、更少错误的代码。 在C++中,类是...

    C++面向对象编程的一些总结

    深入探索C++对象模型中文版是一本帮助开发者理解C++底层机制的书籍,它涵盖了C++内存管理、对象生命周期、构造与析构过程、虚函数表、继承与多态的实现等细节。阅读这本书可以帮助程序员更深入地理解C++的工作原理,...

    C++和Linux学习笔记.zip

    通过深入学习C++和Linux,开发者不仅可以掌握编程技术,还能理解操作系统底层原理,为解决复杂问题和开发高质量软件打下坚实基础。无论你是初学者还是有经验的程序员,这份资料都将帮助你提升技能,开拓视野。

    C++书籍阅读笔记

    首先,"深入探索C++对象模型"是理解C++核心机制的关键。C++的对象模型涉及到内存布局、构造与析构过程、成员访问控制、继承和多态等。深入理解这些内容能帮助开发者编写更高效、更可靠的代码。例如,了解对象的存储...

    C++特征工程学习笔记.md

    ### C++特征工程学习笔记 #### 1. 特征工程概述 特征工程(Feature Engineering)是机器学习项目中至关重要的一步,它涉及到从原始数据中选择、转换和创建特征,目的是为了使这些特征能够更好地匹配机器学习算法,...

    c++学习的50条黄金定律

    - **解析**:《Inside the C++ Object Model》是一本深入了解C++对象模型的书,对于想要深入了解C++底层实现原理的开发者来说非常有用。 #### 31. 学习设计模式 - **解析**:设计模式是解决常见问题的一套解决方案...

    学习C++的忠告50条

    《C++编程语言》和《深入C++对象模型》这两本书都是学习C++的宝贵资源,它们不仅讲解了语言的基础知识,还深入探讨了C++的高级特性和内部机制。通过学习这些书籍,你可以更加深刻地理解C++的运行机制。 #### 4. ...

    ns2学习笔记ns2学习笔记ns2学习笔记

    ### ns2学习笔记知识点解析 #### 一、ns2简介 ns2,即Network Simulator version 2,是一款开源且免费的网络仿真平台,主要用于研究和开发网络技术。它提供了丰富的模块,涵盖了网络技术的众多领域,包括但不限于...

    ROS和C马克学习笔记

    总之,“ROS和C++学习笔记”可能包含了作者在探索这个领域时遇到的问题、解决方法以及对相关概念和技术的理解,对于想要进入机器人编程领域的学习者来说,是一份宝贵的参考资料。通过深入阅读和实践,我们可以从中...

    前辈的c++50个建议

    前者详细介绍了C++的标准库和语法特性,后者则深入探讨了C++对象模型的工作原理。通过阅读这些书籍,能够让你对C++有更深层次的理解。 ### 4. 使用不同的编译器(如VC++, BBC++, MCT++, TC++) 了解多种编译器有助...

    学习ios学习笔记

    在讨论iOS学习笔记之前,首先应当明确iOS开发的核心要素。iOS是苹果公司为其移动设备设计的操作系统,与之对应的开发语言主要是Objective-C以及近年来流行的Swift。Objective-C是一种成熟稳定的语言,它以C语言为...

    x264学习笔记

    【X264学习笔记】是针对视频编码技术H.264的一种深入解析,尤其适合想要理解并掌握X264编码器的开发者。X264是开源的H.264编解码器,能够生成符合H.264/MPEG-4 Part 10标准的.264或.mp4格式的视频文件。 学习H.264...

    高质量程序设计指南:C、C++语言(第3版)

    - **类与对象**:理解类的概念及其继承、封装、多态等特性,构建灵活多变的对象模型。 - **模板与泛型编程**:学会使用模板简化代码,支持不同类型参数的通用处理逻辑。 - **异常处理机制**:掌握try-catch-finally...

    Qt3学习笔记繁体中文

    这份"Qt3学习笔记"应该能为初学者提供全面的指导,从基础概念到实际应用,逐步探索Qt3的魅力。尽管Qt3已更新到更现代的版本,但其设计理念和许多基础组件在新版本中依然沿用,因此学习Qt3对于理解后续版本的Qt也是...

    学习c++的50条忠告(初学者必看)

    - **建议**:同时参考《The C++ Programming Language》和《Inside The C++ Object Model》,这两本书对深入理解C++标准库和对象模型非常有用。 #### 3. 编译器选择 - 选择合适的编译器非常重要,如Visual C++、GCC...

    给C++初学者的忠告

    - **建议**:保持开放的心态,探索C++在其他领域的应用,比如科学计算、系统编程等,这样可以获得更全面的技术积累。 #### 8. 学习C++的过程中不要忽略其他技能 - **解释**:编程不仅仅局限于语言本身,还包括软件...

Global site tag (gtag.js) - Google Analytics