学习
实践
活动
专区
工具
TVP
写文章

C++|对象模型|对象模型综述

作为C++的核心单元,对象模型在编译器眼中是如何实现的?本文从几个基本理论模型出发,剖析实际。 深度探索C++对象模型 ---- 简单对象模型 对象存放若干slots,由slot指向实际成员。 表驱动对象模型 这个模型的function部分可以看做在上面的简单对象模型基础上再增加了一层间接性,因此被称作双表格模型。IBM的系统对象模型SOM也依赖于这种模型。 一个古老的实现方法是,在每一个派生类对象中存放一个虚基类指针而非传统对象模型中的基类对象本身,对虚基类的访问通过指针间接实现,以此实现共享。 ---- C++对象模型 上述模型的Extension部分其实已经涵盖了部分对象模型的静态结构,而对象模型的生成与维护则更多见原书中的一系列章节。 Bjarne Stroustrup设计的C++对象模型从简单对象模型派生而来,对内存空间和存取时间做了优化。

15310

C++对象模型-关于对象

Markdown 画图工具 Processon 1,关于对象 从这篇博客开始真正介绍C++对象模型,前边BB了那么多没用的,终于开始了C++模型的分析。 关于C++对象模型的介绍,我将根据《深度探索C++对象模型》这本书,其书中的每一章,对应一篇博客,博客内容为自己对这本书的理解和补充吧。 pd.init(&pd); } 1.2 class 需要指出的是,C++类的非static的成员函数都有一个隐式的参数,即this(class object *const this)指针(对象的首地址) C++在内存布局以及存取时间上主要的额外负担是虚函数(即链接时的多态)和虚继承(即多次出现在继承体系中的父类,在子类对象中有一个单一共享的实例,其最典型的是菱形继承) 另外,需要指出的是,C++中class class point2d的对象对应的内存布局 通过对比point和point2d的对象内存布局,可知,如果父类中定义了虚函数,并且在子类中进行了重写,则在子类的对象模型中,用子类重写的函数的地址将父类的虚函数地址替换掉

12820
  • 广告
    关闭

    2023新春采购节

    领8888元新春采购礼包,抢爆款2核2G云服务器95元/年起,个人开发者加享折上折

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    探索C++对象模型

    只说C++对象模型在内存中如何分配这是不现实的,所以这里选择VS 2013作为调试环境具体探讨object在内存中分配情况.目录给出了具体要探讨的所有模型,正文分标题依次讨论.水平有限,如有错误之处请多包涵如若能及时反馈于我请接受我的谢意 简单对象模型 首先给出具体的模型和类的代码,然后我们会验证模型是否正确:)  class base { public: base() :baseData(5) {} virtual 单继承对象模型 只要明白了简单对象模型接来的单/多继承也就变得很简单了. derivedDataPtr = (int *)(&d) + 2; std::cout << *baseDataPtr<<*derivedDataPtr; system("pause"); } 多继承对象模型 std::cout << *base1_dataPtr << *base2_dataPtr << *derived_dataPtr; system("pause"); } 菱形多继承对象模型

    32030

    C++对象模型和this指针详解

    这篇文章主要介绍了详解C++对象模型和this指针,是C++入门学习中的基础知识,需要的朋友可以参考下,希望能够给你带来帮助对象模型成员变量和成员函数分开存储一、只有非静态成员变量才属于类的对象上空对象占用字节为 所以每个空对象都会有一个自己的内存地址。 m_B = 0;非静态成员变量 属于类的对象上静态成员变量,不属于类对象上所以不考虑在内四、class Person{int m_A;// 非静态成员变量 属于类的对象上static int m_B;/ voidfunc(){}静态成员函数也不会增加 不属于类对象上this指针用于区分类中多个对象调用函数时,分别都是哪个函数在调用自己。 this 指向被调用的对象,此时为 p1。

    9800

    本周阅读:深度探索C++对象模型

    原因分析 深度探索C++对象模型 1.3 章节 https://github.com/wangcy6/weekly/blob/master/reading-notes/object-model/ 译成中文就是,编译器必须要确保如果一个对象有一个或多个vptr,这些vptr不是由原对象来初始化或改变的。 也就是说:当使用赋值的方式或拷贝构造的方式创建一个对象时,这个对象的vptr与源对象无关。 +对象模型》的4.2节能够找到完美答案,具体摘抄如下:   “表格中的virtual functions地址是如何被建构起来的? +对象模型-构造函数语义学 补充内容 错误理解1 :如果类没有定义任何构造函数,编译器一定会自动生成默认的构造函数 注意:这种说法是错误的(编译器太懒了) 正确的说法: 惟有默认构造函数”被需要“的时候编译器才会合成默认构造函数 编程规范 不要在构造函数中调用虚函数 3 C++编译期多态与运行期多态 补充内容 ?

    50120

    C++|对象模型|多继承虚机制实现

    本文参考深度探索C++对象模型 ---- 我们常常使用基类指针指向派生类对象,那么,为什么基类指针能够如此轻松的调用派生类的方法呢?在多继承的情况下,this指针必须经过调整,才能正确地找到虚表。 下文为你介绍多继承模型下的指针偏移机制 ---- 指针偏移存在机制: 设一个多继承的类内存布局如下,单词代表对象首地址。 函数较大时,产生多重进入点,函数体分为(1)调整this (2)执行自定义函数码,根据是否需要调整,通过thunks跳转至对应的进入点 address points: 虚函数期待获得的是引入虚函数的类对象的地址 换而言之,它首先确保了转入的地址能够正确的指向对应的调用对象,此后再进行传递。

    20720

    实战C++对象模型之成员函数调用

    先说结论:C++的类成员函数和C函数实质是一样的,只是C++类成员函数多了隐藏参数this。 通过本文的演示,可以看见这背后的一切,完全可C函数方式调用C++类普通成员函数和C++类虚拟成员函数。 为了实现C函数方式调用C++类成员函数,准备两个文件:。 1) 被调用的C++类成员函数源代码文件aaa.cpp #include  // fprintf class X { public: void xxx(); private: int m; int n printf("m=%d, n=%d\n", m, n); } 把aaa.cpp编译成共享库: $ g++ -g -o libaaa.so aaa.cpp -fPIC -shared 2) 调用的C+ (*XXX)(struct X*); // 参数实为aaa.cpp中类X的this指针 // 需要指定一个命令行参数argv[1], // 值为aaa.cpp中类X的成员函数xxx的名字, // 因为C+

    52610

    C++对象模型和this指针实例分析(一)

    C++对象模型和this指针 成员变量和成员函数分开存储 在C++中,类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 class Person { public: Person this指针概念 通过4.3.1我们知道在C++中成员变量和成员函数是分开存储的 每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码 那么问题是:这一块代码是如何区分那个对象调用自己的呢 c++通过提供特殊的对象指针,this指针,解决上述问题。 p2.age = " << p2.age << endl; } int main() { test01(); system("pause"); return 0; } 空指针访问成员函数 C+ : 声明对象前加const称该对象为常对象对象只能调用常函数 示例: //常函数 class Person { public: Person() { m_A = 0; m_B = 0;

    6720

    关注

    腾讯云开发者公众号
    10元无门槛代金券
    洞察腾讯核心技术
    剖析业界实践案例
    腾讯云开发者公众号二维码

    相关产品

    • 对象存储

      对象存储

      腾讯云对象存储数据处理方案主要针对于存储于腾讯云对象存储COS中的数据内容进行处理加工,满足压缩、转码、编辑、分析等多种诉求,激活数据价值。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券