![]() |
|
||||||||||||||
| | 网站首页 | 数据库教程 | web编程 | 服务器 | 程序设计 | | ||
|
||
|
||||||
| C++ Object Model | ||||||
作者:佚名 文章来源:不详 点击数: 更新时间:2007-9-12 ![]() |
||||||
|
C++ Object Model Data member 对象属性 Function member 类属性 Static member类属性 Implicit member :virtual pointer and virtual table etc. Virtual mechanism: virtual function and virtual base class Default Constructor的建构操作(观念 和 实际) 有四种情况,会导致编译器必须为未声明Constructor之Classes合成一个Default Constructor。 C++ Standard把那些合成物称为Implicit nontrivial Default Constructor, 只能满足编译器的需要。它们之所以能够完成任务,是凭借Member object 和Base class的Default Constructor, 或者Virtual function ,Virtual base class 机制。至于不是以上情况的而又没有声明任何的Constructor的Classes,我们说它拥有的是Implicit trivial Default Constructor,它们实际上不被合成出来。 Virtual Base Class的实现在不同的编译器有极大的差异,然而每个编译器对虚拟机制的支持保证,每种实现法的共同点在于必须使Virtual Base Class在其每一个Derived class object中的位置,能够于执行期准备妥当。 C++新生误解: 1.没有声明任何的Constructor的Classes会合成出一个Default Constructor。 2.合成出的Default Constructor会明确设定Class 内每个data member。 Copy Constructor Semantics Default member wise initialization: Bitwise Copy Semantics 不要Bitwise Copy的四种情况和合成Implicit nontrivial Default Constructor时一样。 就像Default Constructor的建构操作一样,C++ Standard也把Copy Constructor区分为trivial和non-trivial俩种。只有non-trivial被合成,而决定Copy Constructor属于那种在于Class是否展现出所谓的Bitwise Copy Semantics。 针对虚函数,合成出来的Copy Constructor会明确设定Object的vptr指向对应的virtual table。 程序转换语义 1. 明确的初始化 2. 参数和还回值的初始化 3. 使用者优化 和 编译器优化 4.Member Initialization List Copy Constructor的使用,迫使编译器多多少少对你的程序代码做部分优化。 1. Reference Member & Const Member 2. Call Base Class的Constructor & member Class 的Constructor 编译器会一一操作Member Initialization List,以适当次序在Constructor内部安插初始化操作,并在任何Explicit user code之前。 Presence of a pure virtual function:必须在派生类中覆盖,否则导致编译错误 1. 可以定义和静态调用 2. pure virtual destructor必须定义, 否则不要声明 对对象设定初值,给予一个Explicit initialization list 会比 constructor来得高效。 缺点:1。必须Public 2。只能指定常量 3。非编译器自动施行,可能失败 Copy Assignment Operator Semantics:The same as Copy Constructor,但缺乏initialization list 在虚基类下没有实现压抑上层Base class的copy assignment operator,编译器没有重复类似Constructor的解决方案, 因为取Copy Assignment Operator的地址合法。没有避免多重拷贝,一个实体空间。 Semantics of destruction:The same as Constructor, 但顺序相反: 1) Destructor函数体 2) 拥有Destructor的Member class objects以声明时相反的顺序被调用 3) 如果有virtual pointer, 则现在被重新设定,指向适当之Base class的virtual table。 4) 拥有Destructor的Non-virtual base classes以声明时相反的顺序被调用 5) 拥有Destructor的virtual base classes以构造相反的顺序被调用 此处应该拒绝对称方式的想法,应该因为需要而非感觉来提供Destructor 虚基类->基类->虚表指针->子对象->函数体 Semantics of Data:绑定,布局,存取 Class object 必须容纳所有的non-static members, 可能比想象的大,原因是: 1 编译器自动的扩展,用以支持某些语言特性 2 Alignment的需要 单结构->只有继承->加多态->多重继承->虚拟继承 1. Data Member 的绑定:对Member functions Body的分析,会直到整个class的声明出现后才开始,但对Argument List 并不如此。 2. Data Member 的布局(non-static):C++ Standard要求在同一个access section中,members 的排列只需要符合较晚出现的member在较高的地址,什么会介于其间?Alignment and virtual pointer etc.。 3. Data Member 的存取:Members的位置在编译时固定,存取时只是一个简单的Offset运算。 Static member:于Class之外,独立实体,内部转换为对该唯一的extern实体的直接操作。 Non-static member:对象地址加偏移形成。在虚拟继承下效率会影响,其它情况和struct。 对象成员的效率由快变慢:结构->单一继承->虚拟继承->多重虚继承, 间接性变多 指向Data member的指针效率比直接使用慢一倍不止,继承的引入也如此,只是虚拟继承妨碍了优化的有效性。 C++保证出现在Derived Class中的Base class sub object有其完整性。 Semantics of function Name Mangling:不同编译器不同,编译错误消息用的程序代码函数名称,然而连接器用的是经过mangled 的名称。 Member functions:static , non-static, vitual C++ Standard要求non-static至少要和一般的non-member function有相同的效率。实际上被内化为non-member function:1、安插this参数 2、存取改由this访问 3、Name Mangling 4、调用处转换 只有class拥有virtual function, 就需要额外的执行期信息 1) 在单一继承体系中,virtual机制良好,有效率且容易模型,仅一个virtual tables。 2) 在多重继承中,一个derived class内含一个主要virtual tables和n-1个额外的, n 表示base class的数目。 3) 在虚拟继承中,对虚基类还有一个虚表。 4) 函数的效率:继承深度和继承方式 All functions被编译器改变: 1) non-static, vitual安插this于argument and body,而static没有 2) non-static和static一般调用方式,而vitual通过索引号得到函数地址间接调用 3) 一个static member function,被提出之外,并Mangled。取地址得到的是内存中的地址,由于没有this指针,其地址类型不是指向class member function ,而是一个non-member function指针。指向(non-static data)的指针不同于一般指针,它只提供所属类的对象的相对偏移。指向(virtual function)的指针不同于一般指针,它只提供虚表中的相对偏移。指向(non-virtual function)的指针同于一般指针,它提供函数内存中的地址。 Inline 强有力,但需要更加小心处理。Formal Argument and Local Variable。 执行期语义 对象的构造与解构 1) 全局对象 2) 静态局部对象 3) 对象数组 4) Default constructor and 数组 New 和 Delete 运算符 1) 针对数组的new语意 2) Placement operator new 临时性对象 站在对象模型的尖端 Template 的声明 Template Instantiation 指针和引用,对象化 functions使用时才具现:效率,尝未实现的机能 Error Reporting with a Template::与类型有关的检查,必须延迟到具现, 对Template的处 理是完全解析,而不做类型检查。 Name Resolution with a Template: 1、Scope of the template declaration 2、Scope of the template instantiation 对一个non-member name,是根据name的使用是否与具现出来的Template 参数相关决定的,互不相关则1,若互有关联则2。 模板设计中的非习惯性思维 • 申明并不一定要定义:禁止某些调用或者泛化 • 定义类不一定要有成员、成员不仅仅是方法和成员变量 Exception Handling RTTI Abstract Class • 具有纯虚函数的类就是抽象类 • 抽象类不能被实例化,所以抽象类只能以指针方式被应用 • 抽象类可以防止切片的发生 • 抽象类不产生虚表。 本文来源:http://blog.csdn.net/SZ_RedLin/archive/2007/08/23/1756120.aspx
|
||||||
| 文章录入:admin 责任编辑:admin | ||||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | ||||||
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 网站地图 | 管理登录 | | |||
|