深度探索C++对象模型
文章平均质量分 89
mathZHA
这个作者很懒,什么都没留下…
展开
-
C++对象模型——关键词所带来的差异(第一章)
1.2 关键词所带来的差异 (A Keyword Distinction) 如果不是为了努力维护与C之间的兼容性,C++可以比现在更简单。举个例子,如果没有八种整数需要支持的话,overloaded function的解决方式将会简单得多。同样的道理,如果C++丢掉C的声明语法,就不需要判断下面这一行其实是pf的一个函数调用操作(invocation)而不是声明:// 不知道下原创 2015-07-29 00:04:26 · 892 阅读 · 3 评论 -
C++对象模型——Inline Functions(第四章)
4.5 Inline Functions下面是Point class 的一个加法运算符的可能实现内容:class Point { friend Point operator+(const Point&, const Point&);};Point operator+(const Point &lhs, const Point &rhs) { Point new_pt; new_p原创 2015-08-11 18:20:11 · 828 阅读 · 0 评论 -
C++对象模型——Virtual Member Functions (虚拟成员函数)(第四章)
4.2 Virtual Member Functions (虚拟成员函数)已经看过了 virtual function的一般实现模型:每一个 class 有一个 virtual table,内含该 class 中有作用的 virtual function的地址,然后每个object有一个vptr,指向 virtual table的所在.为了支持 virtual function机制,必须首原创 2015-08-09 19:53:41 · 1527 阅读 · 0 评论 -
C++对象模型——指向Member Function的指针 (Pointer-to-Member Functions)(第四章)
4.4 指向Member Function的指针 (Pointer-to-Member Functions)取一个nonstatic data member的地址,得到的结果是该member在 class 布局中的byte位置(再加1),它是一个不完整的值,需要被绑定于某个 class object的地址上,才能够被存取.取一个nonstatic member function的地址,如果原创 2015-08-11 18:09:45 · 1947 阅读 · 0 评论 -
C++对象模型——构造,解构,拷贝语意学(第五章)
第5章 构造,解构,拷贝语意学 (Semantics of Construction, Destruction, and Copy)考虑下面这个abstract base class 声明:class Abstract_base {public: virtual ~Abstract_base() = 0; virtual void interface() const = 0; vi原创 2015-08-12 18:25:24 · 711 阅读 · 0 评论 -
C++对象模型——"无继承"情况下的对象构造(第五章)
5.1 "无继承"情况下的对象构造考虑下面这个程序片段:1 Point global;23 Point foobar()4 {5 Point local;6 Point *heap = new Point;7 *heap = local;8 // ... stuff ...9 delete heap;10 return local;11 } L1,L5,L6原创 2015-08-12 18:35:16 · 912 阅读 · 0 评论 -
C++对象模型——解构语意学(第五章)
5.4 对象的效率 (Object Efficiency) 在以下的效率测试中,对象构造和拷贝所需要的成本是以Point3d class声明为基准,从简单形式逐渐到复杂形式,包括Plain Ol' Data,抽象数据类型(ADT),单一继承,多重继承,虚拟继承,以下函数是测试的主角:Point3d lots_of_copies(Point3d a, Point3d b)原创 2015-08-14 21:53:40 · 793 阅读 · 0 评论 -
C++对象模型——对象复制语意学 (Object Copy Semantics)(第五章)
5.3 对象复制语意学 (Object Copy Semantics) 当设计一个 class,并以一个 class object指定给 class object时,有三种选择: 1.什么都不做,因此得以实施默认行为. 2.提供一个 explicit copy assignment operator. 3.明确地拒绝一个 class object指定给原创 2015-08-14 21:26:27 · 907 阅读 · 3 评论 -
C++对象模型——继承体系下的对象构造(第五章)
5.2 继承体系下的对象构造当定义一个object如下:T object; 时,实际上会发生什么事情呢?如果T有一个constructor(不论是由user提供或是由编译器合成),它会被调用.这很明显,比较不明显的是,constructor的调用真正伴随了什么?constructor可能内带大量的隐藏码,因为编译器会扩充每一个constructor,扩充程度视 class T的继承体系原创 2015-08-13 20:10:43 · 909 阅读 · 0 评论 -
C++对象模型——对象的构造和解构(第六章)
6.1 对象的构造和解构 (Object Construction and Destruction) 一般而言,constructor和destructor的插入如预期所示:{ Point point; // point.Point::Point() 一般而言会被插入在这里 ... // point.Point:;~Point() 一般而言原创 2015-08-15 23:36:50 · 1143 阅读 · 0 评论 -
C++对象模型——执行期语意学(第六章)
第6章 执行期语意学 (Runtime Semantics) 想象一下有下面这个简单的式子:if (yy == xx.getValue()) // ... 其中xx和yy定义为:X xx;Y yy; class Y的定义为:class Y {public: Y(); ~Y(); bool operator==(const原创 2015-08-15 22:58:38 · 611 阅读 · 0 评论 -
C++对象模型——new 和 delete 运算符(第六章)
6.2 new 和 delete 运算符 运算符 new 的使用,看起来似乎是个单一运算,像这样:int *pi = new int(5); 但事实上它是由以下两个步骤完成: 1.通过适当的 new 运算符函数实体,配置所需的内存:// 调用函数库中的new运算符int *pi = __new(sizeof(int)); 2.给配置得来的对象设立初值原创 2015-08-16 23:13:00 · 944 阅读 · 0 评论 -
C++对象模型——临时性对象 (第六章)
6.3 临时性对象 (Temporary Objects) 如果有一个函数,形式如下:T operator+(const T &, const T &); 以及两个T objects,a和b,那么:a + b; 可能会导致一个临时性对象,以放置传回的对象.是否会导致一个临时性对象,视编译器的进取性(aggressiveness)以及上述操作发生时的程序上下关系原创 2015-08-17 22:40:33 · 761 阅读 · 0 评论 -
C++对象模型——Copy Constructor 的建构操作(第二章)
2.2 Copy Constructor 的建构操作 有三种情况,会以一个object的内容作为另一个 class object的初值,最明显的一种情况就是对一个object做显式的初始化操作,例如:class X { ... };X x;// 明确地以一个object的内容作为另一个class object的初值X xx = x; 另两种情况是当objec原创 2015-07-30 23:25:22 · 1226 阅读 · 0 评论 -
C++对象模型——Default Constructor的建构操作(第二章)
第2章 构造函数语意学 (The Semantics of Constructor) 关于C++,最常听到的一个抱怨就是,编译器背着程序员做了太多事情.Conversion运算符就是最常被引用的一个例子.2.1 Default Constructor的建构操作 C++ Annotated Reference Manual(ARM)指出"default const原创 2015-07-29 23:59:19 · 730 阅读 · 0 评论 -
C++对象模型——对象的差异(第一章)
1.3 对象的差异 (An Object Distinction) C++程序设计模型直接支持三种programming paradigms(程序设计典范)1. 程序模型 (procedural model) 就像C一样,C++当然也支持它,字符串的处理就是一个例子,可以使用字符数组以及str*函数集:char boy[] = "Danny";char *原创 2015-07-29 09:35:26 · 817 阅读 · 0 评论 -
C++对象模型——函数的效能(第四章)
4.3 函数的效能在下面的这组测试中,在不同的编译器上计算两个3D点,其中用到一个nonmember friend function,一个member function,以及一个 virtual member function,并且 virtual member function分别在单一,虚拟,多重继承三种情况下执行.下面就是nonmember function:void cross_p原创 2015-08-11 17:51:38 · 671 阅读 · 0 评论 -
C++对象模型——关于对象(第一章)
第一章 关于对象在C语言中,"数据"和"处理数据的操作(函数)"是分开声明的,也就是说,语言本身并没有支持"数据和函数"之间的关联性.我们把这种程序方法成为程序性,由一组"分布在各个以功能为导向的函数中"的算法所驱动,它们处理的是共同的外部数据.举个例子,如果声明一个struct Point3d,像这样:typedef struct point3d{ float x;原创 2015-07-28 00:07:05 · 826 阅读 · 0 评论 -
C++对象模型——成员初始化列表(第二章)
2.4 成员初始化列表 (Member Initialization List) 当编写一个类的构造函数时,有可能设定类成员的初始值,或者通过成员初始化列表初始化,或者在构造函数内初始化,除了四种情况,其实任何选择都差不多。 本节中,首先澄清何时使用初始化列表才有意义,然后解释初始化列表内部的真正操作是什么,然后再看一些微妙的陷阱。 下列情况中,为了让程序能够被原创 2015-08-01 22:50:46 · 661 阅读 · 0 评论 -
C++对象模型——Data Member的存取(第三章)
3.3 Data Member的存取 已知下面这段代码:Point3d origin;origin.x = 0.0; x的存取成本是什么? 答案视x和Point3d如何声明而定,x可能是个 static member,也可能是个nonstatic member.Point3d可能是个独立(非派生)的 class,也可能从另一个单一的base class原创 2015-08-04 18:03:04 · 964 阅读 · 1 评论 -
C++对象模型——Data Member的绑定(第三章)
3.1 Data Member的绑定 (The Binding of a Data Member) 考虑下面这段代码:// 某个foo.h头文件,从某处含入extern float x;// 程序员的Point3d.h文件class Point3d {public: Point3d(float, float, float); // 问题:被传回和被设定的原创 2015-08-03 00:01:40 · 930 阅读 · 0 评论 -
C++对象模型——Data 语意学(第三章)
第3章 Data 语意学 计算如下代码的sizeof结果:class X{};class Y : public virtual X{};class Z : public virtual X{};class A : public Y, public Z{}; 上述X,Y,Z,A中没有任何一个 class 内含明显的数据,只表示了继承关系,所以认为每一个 class 的原创 2015-08-02 16:35:59 · 609 阅读 · 0 评论 -
C++对象模型——"继承"与Data Member(第三章)
3.4 "继承"与Data Member 在C++继承模型中,一个derived class object所表现出来的东西,是其自己的members加上其base class members的总和.至于derived class members和base class members的排列次序并未在C++ Standard中强制指定:理论上编译器可以自由安排.在大部分编译器上,base clas原创 2015-08-05 21:35:30 · 1058 阅读 · 0 评论 -
C++对象模型——程序转化语意学(第二章)
2.3 程序转化语意学 (Program Transformation Semantics) 如下程序片段所示:#include ‘"X.h"X foo() { X xx; return xx;} 看到这个代码,可能做出以下假设: 1. 每次foo()被调用,就传回xx的值 2. 如果 class X定义了一个copy原创 2015-07-31 16:09:25 · 910 阅读 · 2 评论 -
C++对象模型——关于对象(第一章)
第一章 关于对象1.1 C++对象模式(The C++ Object Model)1.1.3 C++对象模型(The C++ Object Model) Stroustrup当初设计(当前仍占有优势)的C++对象模型是从简单对象模型派生而来的,并对内存空间和存取时间做了优化.在此模型中,Nonstatic data members被配置于每一个class obj原创 2015-07-28 18:00:27 · 507 阅读 · 0 评论 -
C++对象模型——对象成员的效率 (Object Member Efficiency)(第三章)
3.5 对象成员的效率 (Object Mem ber Efficiency) 下面某个测试,目的在测试聚合(aggregation).封装(encapsulation),以及继承(Inheritance)所引发的额外负荷的程度.所有测试都是以个别局部变量的加法,减法,赋值(assign)等操作的存取成本为依据.下面就是个别的局部变量:float pA_x = 1.725, pA_y =原创 2015-08-06 21:30:47 · 758 阅读 · 0 评论 -
C++对象模型——Template中的名称决议方式 (第七章)
Template中的名称决议方式 (Name Resolution within a Template) 必须能够区分以下两种意义,一种是C++ Standard所谓的"sope of the template",也就是"定义出template"的程序.另一种是C++ Standard所谓的"scope of the template instantiation",也就是"具现出temp原创 2015-08-19 23:09:33 · 723 阅读 · 0 评论 -
C++对象模型——Member的各种调用方式(第四章)
第四章 Function语意学 (The Semantics of Function)如果有一个Point3d的指针和对象:Point3d obj;Point3d *ptr = &obj; 当这样做:obj.normalize();ptr->normalize(); 时,会发生什么事情呢?其中的Point3d::normalize()定义如下:Point3d Point3d::原创 2015-08-08 19:49:48 · 1693 阅读 · 0 评论 -
C++对象模型——指向Data Members的指针(Pointer to Data Members)(第三章)
明天见原创 2015-08-07 20:04:04 · 1404 阅读 · 1 评论 -
C++对象模型——异常处理 (Exception Handling)(第七章)
7.2 异常处理 (Exception Handling) 欲支持exception handling,编译器的主要工作就是找出 catch 子句,以预处理被丢出来的exception.这多少需要追踪程序堆栈中每一个函数的当前作用区域.同时,编译器必须提供某种查询exception objects的方法,以知道其实际类型(这直接导致某种形式的执行期类型识别,也就是RTTI).最后,原创 2015-08-20 22:48:51 · 1468 阅读 · 0 评论 -
C++对象模型——执行期类型识别(第七章)
7.3 执行期类型识别 (Runtime Type Identification,RTTI) 下面这样的转型形式:pfct pf = pfct(pt); 被称为downcast(向下转型),因为它有效地把一个base class 转换至继承结构的末端,变成其derived classes中的某一个.Downcast有潜在性的危险,因为它遏制了类型系统的作用.Typ原创 2015-08-22 23:58:31 · 927 阅读 · 0 评论 -
C++对象模型——效率有了,弹性呢(第七章)
7.4 效率有了,弹性呢 传统的C++对象模型提供有效率的执行期支持.这份效率,再加上与C之间的兼容性,造成了C++的广泛被接受度.然而,在某些领域方面,像是动态共享函数库(dynamically shared libraries),共享内存(shared memory),以及分布式对象(distributed object)方面,这个对象模型的弹性还是不够.动态共享函数库原创 2015-08-23 23:58:01 · 643 阅读 · 0 评论 -
C++对象模型——站在对象模型的尖端 (第七章)
第7章 站在对象模型的尖端 (On the Cusp of the Object Model) 这一章讨论三个著名的C++语言扩充性质,它们都会影响C++对象.它们分别是 template, exception handling(EH)和runtime type identification(RTTI).7.1 Template C++程序设计的风格以及习惯原创 2015-08-18 16:18:17 · 660 阅读 · 0 评论