深度探索C++对象模型一书观后感
文章平均质量分 80
说是观后感,其实是随便写写,因为这书比较烧脑,算是加深一下记忆吧。
纹枰老妖
这个作者很懒,什么都没留下…
展开
-
深度探索c++对象模型之执行期的类型识别RTTI
在cfront中,用来表现一个程序的内部类型体系,看起来像这样://程序层次结构的根类(root class)class node{...};class type : public node{...};//两个函数陈述class fct : public type{...};class gen : public type{...};其中第二个gen是generic的缩写,意思是通原创 2017-04-08 18:36:14 · 835 阅读 · 0 评论 -
深度探索c++对象模型之异常处理的前介
对于exception handling【异常处理】来说,编译器的主要工作是找出所有的catch子句,以处理被丢出来的exception。这就需要追踪程序堆栈中的每一个函数的当前作用域,包括追踪函数中的local class object当时的情况。在此同时,编译器还得提供某种查询exception object的方法,以知道它的真正类型,这就导致了执行器的RTTI【类型识别】。最后,还需要某种机原创 2017-02-12 17:49:54 · 593 阅读 · 0 评论 -
深度探索c++对象模型之member function的具现行为
对于template 的支持,最困难的就是template function的instatiation【具现】。截至此书问世,大家的编译器提供了两种策略:一个是编译时期策略——模板程序代码必须在program text file【程序文本文件】中备好可用;另一个是编译时起策略,有一些meta-compilation【元编译】工具可以导引编译器的具现行为。 对于编译器的设计者们,必须要原创 2016-12-11 20:15:06 · 704 阅读 · 0 评论 -
深度探索c++对象模型之template中的名称决议方式
我们应该能够区分以下两种意义:一个是c++ standard标准中的“scope of the template definition”【模板定义域】,另一个是c++ standard标准中的“scope of the template instantiation”【模板具现域】。第一种情况举例说明:// scope of the template definition【模板定义域】exter原创 2016-12-06 18:45:01 · 781 阅读 · 2 评论 -
深度探索c++对象模型之template的错误报告
考虑下面的template声明【里面有不少错误】:templateclass Mumble{public$: //第一处错误,非法标识符$ Mumble( T t=1024 ) //第二处错误,t被初始化1024,但如果我们给mumble绑定的是char呢? :_t(t) //第三处错误,_t并不是哪一个mumble中的成员,tt才是。这种错误一般会在类型检查这个阶段查找出来。每原创 2016-12-03 16:40:24 · 1016 阅读 · 0 评论 -
深度探索c++对象模型之template的具现行为
让我们先来设计一个模板类,名字叫Point:template class Point{public: enum Status{ unallocated, normalized }; Point( Type x=0.0, Type y=0.0, Type z=0.0 ); ~Point(); void* operator new( size_t ); void ope原创 2016-12-02 18:26:06 · 1062 阅读 · 0 评论 -
深度探索c++对象模型之临时对象的传说
有一种说法是,由于临时对象的产生,c++的执行会浪费掉不少效率,因此在以前的计算机界,c++只能成为FORTRAN等主流语言之外的第二语言。还有不少人认为,这种效率上的浪费足以掩盖c++在抽象对象化上做出的贡献。 在FORTRAN-77和c++的一场较量中,Kent Budge和他的助手分别FORTRAN和c++写了一个复数测试程序,在FORTRAN中的复数是内建类型,而在c++中它原创 2016-12-01 18:56:05 · 495 阅读 · 0 评论 -
深度探索c++对象模型之临时对象的探讨
如果我们有一个自定义类类型T,里面有一个int变量x,再在里面定义了一个operator+【T operator+( const T& _a, const T& _b)】,然后我们声明了3个T对象a、b、c,当我们写【c = a+b;】时,编译器会不会为我们这个表达式产生一个临时性T对象呢? 答案是未必。对于现在的大多数编译器来说,要看我们怎么写,如果我们写成【T c = a+b;】原创 2016-12-01 18:44:39 · 533 阅读 · 0 评论 -
深度探索c++对象模型之placement operator new语意
首先谈谈new、delete和operator new、operator delete的区别:new和delete只是c++中的运算符而已!而operator new和operator delete则是c++中的函数,是可以重载的函数,被重载时,第一个参数是是要求分配空间的大小(字节),类型一般是size_t,除此之外,还可以带其它的参数,但该函数的返回类型必须是void *;此外,它与new不同原创 2016-11-18 18:50:08 · 668 阅读 · 0 评论 -
深度探索c++对象模型之带有constructor类数组的new语义学
还记得我们以前谈过的“vec_new”吗,它只针对有constructor的类数组,像我们写【int *p = new int[5];】或【My_Simple_Class *pm = new My_Simple_Class[7]; //我们的My_Simple_Class没有定义声明constructor或destructor】,在编译器层面是没有使用vec_new的,因为它们只是单纯的开辟内存和原创 2016-11-13 20:19:29 · 968 阅读 · 0 评论 -
深度探索c++对象模型之new和delete运算符介绍
在c++中,无论是new还是delete,它们都被当成是运算符的,new运算符对应的是C语言中的malloc函数【在new的重载运算符函数里面调用malloc】,而delete自然对应的是C语言中的free函数了。当我们写下一句【int *p = new(7);】时,在编译转化后,最简单的版本也是这种://编译过后int *p = _new( sizeof(int) ); //第一步*p原创 2016-11-09 20:31:16 · 605 阅读 · 0 评论 -
深度探索c++对象模型之类对象数组的黑盒
还是以前的Point类,如果我们用Point声明了一个数组,比如【Point p[10];】,在编译器层面会发生什么呢?这要分为两种情况,首先,如果我们在定义Point类时,既没有定义一个constructor,也没有定义一个destructor,那么建立Point类对象的数组和建立一个int类型的数组并没有什么本质区别,只要开辟出10个连续的内存能储存这些Point元素就可以了;但是,如果Poi原创 2016-11-07 17:55:20 · 545 阅读 · 0 评论 -
深度探索c++对象模型之虚继承的对象构造
郑重声明:以下文字“借鉴”自侯捷老师的译作《深度探索C++对象模型》部分内容,写在这里,算是加深自己对此书内容的记忆,因为鄙人水平太浅,难免有理解错误的地方,如果有朋友看出来,还请费神指出,鄙人不胜感激! 让我们先来看这样一个继承体系,首先声明一个Point类作为基类,然后再声明两个Point3d和Vertex,它们俩都虚拟继承自Point类,接着再申请一个Vertex3d类,它继承原创 2016-11-02 19:05:51 · 705 阅读 · 0 评论 -
深度探索c++对象模型之vptr初始化语意学
上一篇中,我提到了关于一个派生类对象构造时,里面基类们的构造顺序,是从内到外、从根源到末端。所以对一个PVertex对象来说,它的构造顺序是:1、Point 2、Point3d 3、Vertex 4、Vertex3d 5、PVertex,然后书中说到【大意】:在以上的每一个类中,都定义两个虚函数,一个是fun【我自己取的名】,一个是size,其中它俩的关系是,在size中调用fun;然后原创 2016-11-03 20:38:35 · 785 阅读 · 0 评论 -
深度探索c++对象模型之类对象的赋值
在C++中,当我们声明一个类时,如果没有给这个类操作符“=”定义一个函数,那么一般情况下编译器会自动为这个类合成一个默认的copy assignment operator【拷贝赋值操作符】,而这种copy assignment operator的工作模式是bitwise copy,所谓的bitwise copy,意思就是按位施以拷贝【两个类对象除了在内存中的位置不一样,其它的一模一样】。但这种模式原创 2016-11-04 17:48:54 · 767 阅读 · 1 评论 -
深度探索c++对象模型之类全局对象的初始化与析构
与C语言相比,c++复杂的地方与很多,其中之一就是对全局对象的初始化。在C语言中很简单,不管是内带类型还是自定义的结构体类型,如果声明为全局对象并且我们没有给它们一个显示的常量初始化的话,那么它们都会被0默认初始化。但在c++中这样显然不行,想象一下一个有着虚函数的类全局对象,我们该如何给其中的虚函数表指针初始化呢?所以,考虑一下这个代码段:Matrix identity;int main原创 2016-11-05 18:42:25 · 780 阅读 · 0 评论