刚看完了《深度探索C对象模型》第三章,这里做一下总结,也写一下我自己在g7.5.0上的验证。本文中所有的源文件都可以在这里拿到(百度网盘链接)。注意,这里所说的“对象”是指在C中使用class或struct关键字创建的类的实例。 1.无继承情况下的C对象内存布局 首先当然是从最基础的情况来讲,在没有继承的情况下的C对象内存布局是什么样的?这又分为两种:无虚函数和有虚函数。 1.1无虚函数 C类内成员变量分为两类:static成员变量和非static成员变量。static成员变量不在类的实例的内部,在整个内存中只有一份,只需要使用类名即可访问;而非static成员变量在类的实例内部,需要为其分配...

  n7Ml4MMwml9O   2023年11月02日   74   0   0 C++

上一篇博客《C对象模型:g实现(一)》用我的理解总结了在无继承体系下g实现的C对象的内存布局,这篇就来总结一下在有继承情况下的C对象的内存布局。本文中所有代码均可从这里拿到(百度网盘)。 1.有继承情况下的C对象的内存布局 C是支持多继承的,而多继承可能就会出现继承的两个(或多个)类有公共的父类,为了防止在一个对象中出现多个公共父类的实体,C就提出了虚继承。因此总的来说C的继承有两种:无虚继承和有虚继承。 1.1无虚继承 在无虚继承情况下,无论是public继承还是protected、private继承,其内存布局都是一样的,因此这里只提供public继承的例子。 1.1.1所有的基类和派生类...

  n7Ml4MMwml9O   2023年11月02日   73   0   0 C++

这篇讲一下《深度探索C对象模型》第三章最后没总结的一部分,就是类的成员变量指针。这里所谓类的成员变量指针就是指绑定某个类的某个成员变量的指针,而不是某个对象的某个成员变量的指针,下面展现了两者的不同: //test14.cpp include<cstdio> structTest{ charc; shorts; inti; }; intmain(){ Testt={.c=1,.s=2,.i=3}; intpi=&t.i;//这个指向对象的成员变量的指针,类型为int intTest::pmi=&Test::i;//这是指向类的成员变量的指针,类型为intTest...

  n7Ml4MMwml9O   2023年11月02日   38   0   0 C++

这篇博客开始总结《深度探索C对象模型》的第四章,即C中成员函数(除了构造函数和析构函数)相关的内容。介绍了C类中的成员函数,包括常规成员函数、虚函数、静态函数。其实我一直犹豫要不要写这一篇,因为在书中讲到虚继承下的虚函数时只是说实现很复杂,并没有具体讲有什么样的实现,我个人也因为技术力的原因没办法总结出g实现的多重继承下的虚函数实现,只能通过调试软件管中窥豹。但我最终还是决定,权当给自己巩固的机会。 1.C类中各种成员函数 1.1非静态(非static)、非虚(非virtual)成员函数 这是最常规的一种成员函数,必须通过其绑定的对象或指针调用。 //test20.cpp include&lt...

  n7Ml4MMwml9O   2023年11月02日   51   0   0 C++

最近在忙自己的研究生科研工作和尽量在不看源码的情况下写一个玩具版的muduo(我已经看过陈硕的《Linux多线程服务端编程:使用muduoC网络库》,相当于按自己的理解再写一遍),没太有时间写C对象模型的后面部分,等组会开完后再继续写。今天就写一下几天前看到的一个小技巧,也即标题:std::weak_ptr<void>绑定到所有类型的std::shared_ptr。 std::weak_ptr 我们知道weak_ptr目的是为了防止只使用std::shared_ptr导致的循环引用,从而导致内存泄漏。一个经典的例子如下: include<iostream> includ...

  n7Ml4MMwml9O   2023年11月02日   64   0   0 C++

这篇博客来讲一下g实现的C对象模型中的虚函数的实现,包括:单一继承体系下的虚函数,多继承下的虚函数和虚继承下的虚函数。其中虚继承下的虚函数在《深度探索C对象模型》中只是说很复杂,受限于技术力和查到的资料,这里我只是对于g的部分实现进行观察。 1.单一继承体系下的虚函数 在前面的博客中我们已经通过对虚表的探索讲了虚函数的一般实现,大体上来说就是编译器会在适当的时候(在单一继承体系中就是当类中第一次出现虚函数的时候)添加一个虚表指针,指向属于该类的虚函数表,而所有虚函数的地址会出现在虚表指针的固定表项,也就是说在继承体系下的一个虚函数会被赋予固定的虚表下标。当派生类覆写(override)了基类的...

  n7Ml4MMwml9O   2023年11月02日   46   0   0 C++

这篇博客开始介绍《深度探索C对象模型》第四章的剩余部分,包括成员函数指针和内联函数。 1.成员函数指针 对于静态成员函数,其和常规的函数是一样的,故这里不做介绍。下面主要介绍非静态的成员函数指针,包括普通的非virtual成员函数指针和virtual成员函数指针。注意,这篇是按照《深度探索C对象模型》的内容写的,最后讲到支持多继承的成员函数指针时才会给出真正的成员函数指针的实现! 1.1非virtual成员函数指针 对于一个非virtual的成员函数取址,得到的就是该成员函数在内存中的地址,但是它不能单独调用,需要使用其绑定的对象/指针/引用调用。 //test26.cpp classTes...

  n7Ml4MMwml9O   2023年11月02日   56   0   0 C++

这篇博客来总结一下《深度探索C对象模型》第5章构造、析构、拷贝语义学的内容。是对主要内容的总结,原文请看原书。 1.构造函数 按照发生的顺序,一个类的构造函数会做的事情: 所有虚基类的构造函数会被调用,从左到右,从深到浅: 如果虚基类被列在memberinitializationlist(成员初始化列表)中,那么如果有任何明确指定的参数,都应该传递过去;如果没有列在list中,而该类有defaultconstructor,也应该调用; 此外,类中每一个virtualbaseclasssubobject(虚基类子对象,此处我写为“子对象”意为其是该类的一部分)的偏移量(offset)必须在...

  n7Ml4MMwml9O   2023年11月02日   101   0   0 C++

关于最近 最近在看算法相关的,接下来想记录一下自己学习的、个人认为比较值得记录的算法。这篇博客主要是用自己的理解复述了根据中序、前序遍历重建二叉树这个博客的内容,大家可以主要看这个博客,我写得不如远矣。 根据前序和中序遍历重建二叉树 我们知道前序、中序、后序遍历二叉树有很多方法,比如递归进行遍历,使用栈/队列进行深度/广度优先遍历,更有甚者使用Morris方法进行额外空间复杂度为O(1)的遍历,但从遍历后的序列重建二叉树就比较麻烦。这里描述一下从前序遍历序列和中序遍历序列重构二叉树的方法,要求二叉树没有重复的元素。这里我先给出二叉树节点的定义: structTreeNode{ public: ...

  n7Ml4MMwml9O   2023年11月01日   99   0   0 算法与数据结构

约瑟夫环问题 百度百科中写道:"约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。"其可以理解成有一个[0..N-1]的数组,从下标0开始,每次删掉第m个数,下一轮从被删掉的下一个数字开始,直至只剩下最后一个,那么最后剩下的一个是哪个数字?我们以[0,1,2,3,4],m=3为例。从下标0开始,删掉第3个数,就是下标为m-1=2,那么删掉后就是[0,1,3,4],下一次从3(下标为2)开始。[0,1,3,4]从3(下标2)开始就等价于[3,4,0,1]从下标0开始,删掉第3个:0。以此类推,下一个数组就是[1,3,4],删掉4。再下一个...

  n7Ml4MMwml9O   2023年11月01日   178   0   0 算法与数据结构
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~