![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
深度探索C++对象模型
文章平均质量分 92
《深度探索C++对象模型》
alpha miao~
这个作者很懒,什么都没留下…
展开
-
C++对象模型剖析(十六)一一执行期语义学(二)
这个问题书上并没有给出答案,这里说一下我的观点:我觉得编译器应该会在new的时候做一个标记,在下次new的时候检查这个标记判断是否需要调用析构函数,比如。还有一个点需要我们注意:**一般来说C++的内存管理会将内存分为五个区:常量区,静态(全局)区,栈区,堆区,自由存储区。的调用都必须传回一个独一无二的指针。也就是说我们可以这样,我写过的一个内存池就是用这种方法来分配定长的内存块来避免内存碎片化,虽然可能会有点内存的浪费。,哈哈,作者说这是引入new重载之后的已给最隐晦的问题,大家重载的时候需要注意一下。原创 2024-03-14 11:03:46 · 303 阅读 · 0 评论 -
C++对象模型剖析(十五)一一执行期语义学(一)
的函数,产生出以class object构造而成的数组。在比较新的编译器中,则是提供两个,一个用来处理没有virtual base class的class,另一个用来处理内含virtual base class 的class。如上所示,每当一个对象被定义的时候,编译器就会显式插入一个该对象的构造函数,当该对象所在的作用为即将结束的时候,编译器就会自动为它安插一个析构函数。并没有定义一个constructor或者一个destructor,那么我们的编译器确实是直接为其分配一个足够的空间即可。原创 2024-03-13 10:55:48 · 925 阅读 · 0 评论 -
C++对象模型剖析(十四)一一构造、析构、拷贝语义学(四)
编译器默认是使用逐字进行拷贝的,但是上面的class中并没有指针或者应用这一类的东西,所以默认的拷贝行为也是足够的,而且编译器默认的行为不仅足够还有效率。当class内含member object 或者class的base class,它们中定义了destructor,那么编译器就会自动合成一个或者在我们定义的destructor中进行拓展,调用他们的destructor。否则,destructor被视为不需要,也就不需要被合成。的一个虚拟派生类,所以,在同一个继承体系中,不止一个类对。原创 2024-03-11 10:24:00 · 618 阅读 · 0 评论 -
C++对象模型剖析(十三)一一构造、析构、拷贝语义学(三)
书原话:以此为杠杆,我们可以产生更有效率的constructor。某些新进的编译器把每一个constructor分裂为二,一个针对完整的object,另一个针对subobject。“完整object”版无条件地调用 virtual base constructor,设定所有的vptrs等。“subobject”版则不调用virtual base constructor,也可能不设定vptrs等。vptr 初始化语义学 (the semantic of the vptr initialization)原创 2024-03-09 11:49:01 · 593 阅读 · 1 评论 -
C++对象模型剖析(十二)一一构造、析构、拷贝语义学(二)
编译器在优化状态下可能会把object的连续内容拷贝到另一个object身上,而不会实现一个精确地“以成员为基础”的赋值操作。一般而言,如果一个类中有比较多的函数返回一个 local class object,那么为这个类设计一个拷贝构造函数是有必要的。一般而言,编译器会对类的每一个构造函数进行扩张,扩张的程度由类的继承体系而定。能够避免一个多余的无效操作,也能避免在拷贝的时候将原来的对象释放,造成悬空引用。书上还给出一个用例,给我们展示了编译器对类的扩充的结果,我们先来看看把。原创 2024-03-08 11:15:04 · 985 阅读 · 1 评论 -
C++对象模型剖析(十一)一一 构造、析构、拷贝语义学(一)
C++中保证在一个继承体系中的每一个 class object 的 destructor 都会被调用。并且编译器并会为一个类中的 pure virtual destructor 拓展其定义,所以,在设计一个类的时候,我们应该不要把virtual destructor 申明为 pure。我们再看一下。原创 2024-03-07 11:40:15 · 606 阅读 · 0 评论 -
C++对象模型剖析(十)一一Function语义学(三)
如果 vprt 被编译器放在 class 对象的开头处,这个字段就没有必要了,代价则是C对象兼容性降低,这些字段只在多重继承或虚拟继承的情况下才有必要,有许多编译器在自身内部根据不同的 classes 特性提供了多种指向 member functions 的指针的形式。换句话说,如果实际参数是一个常量表达式(constant expression),我们可以在替换之前先完成其求值操作,后继的inline替换,就可以把常量直接绑定上去,如果既不是常量表达式,也不是带有副作用的表达式,那么就直接替换。原创 2024-03-06 10:29:44 · 1076 阅读 · 0 评论 -
C++对象模型剖析(九)一一Function语义学(二)
这一小节还是将的有点抽象的,我在后面的多继承那里卡了挺久的,有一些涉及到内嵌汇编的小东西,哈哈哈。原创 2024-03-04 11:49:44 · 944 阅读 · 0 评论 -
C++对象模型剖析(八)一一Function语义学(一)
Function语义学(一)C++支持三种类型的 function:nonstatic member functionstatic member functionvirtual member funcionMember 的各种调用方式Nonstatic Member Funcions非静态成员函数C++的设计准则之一就是:**nonstatic member funcion 至少必须和一般的 nonmember funcion 有相同的效率。**也就是说调用 nonstatic mem原创 2024-03-03 13:24:13 · 648 阅读 · 0 评论 -
C++对象模型剖析(七)一一Data语义学(三)
一般的实现方法是这样的:**Class 如果内含一个或多个 virtual base class subobjects,像 istream 那样,将被分割成两部分,一个不变区域和一个共享区域。这样我们就能够很清楚的知道多重继承和虚拟继承的区别,而且我们也能看出在多重继承的体系下,我们需要维护两个 ios base class object ,这就造成了空间和效率上的浪费,我们不仅要为这两个 ios object 分配空间,我们还要同步对他们的修改操作,来保证两个 object 是一样的。原创 2024-03-02 11:27:27 · 966 阅读 · 0 评论 -
C++对象模型剖析(六)一一Data语义学(二)
我的理解就是,一般来说,一个类的成员变量都是私有的,但是类会提供访问这些成员变量的接口,这些接口是公开的,但一个类的继承了另一个类之后,派生类虽然在实际上拥有了基类的成员变量,但是逻辑上,派生类对基类成员变量的访问时受到接口的限制的,同时,每一个接口的作用范围都被限定在了声明该接口的类中,并不能对其他类的成员变量进行修改,这应该差不多就是这个意思了。但是,现在 test1 和 test2 都是 8字节,拷贝的时候也都是拷贝 8 字节,这就导致了 test1 的数据会覆盖 test2 中的数据,导致原本的。原创 2024-03-01 12:35:38 · 1046 阅读 · 1 评论 -
C++对象模型剖析(五)一一 Data语义学(一)
这时候,我们不能够说 pt 必然指向哪一种 class type(因此,在编译期,编译器无法确定这个 member 的真正的偏移位置 offset,所以 pt 的存取操作就会延至执行期,经由一个额外的间接引导,才能解决。比如 vptr,但是不同的编译器会将 vptr 放在不同的位置上,有的会将 vptr 放在 class object 的头部,有的则会将 vptr 放在 class object 的尾部。如果取一个 static data member 的地址,会得到一个指向其数据类型的指针。原创 2024-03-01 11:49:48 · 1006 阅读 · 1 评论 -
C++对象模型剖析(四)一一构造函数语义学(三)
作者在书中给出的忠告:**请使用 “存在于 constructor 体内的一个 member”,而不要使用 “存在于 member initialization list 中的 member”,来为另一个 member 设定初值。这一期,我们讲 class 的 成员初值化列表(Member Initialization List)的使用以及可能存在的坑。本章对初值化列表的学习就到这里,后面还会在其他章节深入地讲解一下初值化列表,顺便分析他的底层的实现。但是初值化列表的初始化的顺序是 先 t1, 再 t2。原创 2024-02-28 10:32:11 · 394 阅读 · 0 评论 -
C++对象模型剖析(三)一一构造函数语义学(二)
先看第一个例子public:private:这种时候,就没有必要设置一个 copy cosntructor,这种情况下使用 bitwise copy 既高效又安全。原创 2024-02-28 10:30:07 · 974 阅读 · 0 评论 -
C++对象模型剖析(二)一一构造函数语义学(一)
两个常见的误解。原创 2024-02-27 21:30:51 · 680 阅读 · 0 评论 -
C++对象模型剖析(一)
C++以下列方法支持多态:经由一组隐式的转化操作。例如把一个derived class 指针转化为一个指向其public base type的指针。原创 2024-02-25 20:01:35 · 1020 阅读 · 1 评论