zoukankan      html  css  js  c++  java
  • c++对象模型是什么,对象的内存布局和结构问题

    在c++发明的初期对于c++对象模型的争论从来没有停止过直到标准委员会通过了最终的c++对象模型这件事情才变得尘埃落定。C++对象模型可能是最不需要去解释的,但是又是不得不去说的因为c++的入门最先接触的就是c++对象。在上个世纪一共有三种c++对象模型,它们的出现可以说是一个不断优化的过程最终只有我们目前看到的c++对象模型在使用。了解c++对象模型非常重要,了解之后对于对象的内存布局,内存大小,虚函数以及静态数据成员和成员函数的理解有非常巨大的帮助。言归正传,下面就来分别讨论c++的三种对象模型(本来只应该讨论目前有的,但是不和原来的被废弃的对比又怎么能体现出目前c++对象的优秀呢)。下面的对象模型都以该类为基础进行说明

     

     

    15.1最简单的对象模型

    只有slot索引简单来说就是利用一个索引槽来完成,每一个对象obj都拥有众多的slot槽,这些索引槽分别指向类的数据成员和成员函数,虽然时间存取效率高了但是却赔上了巨大的内存开销,在那个内存很昂贵的时代是不能容忍的,就像下面的图。

     

    15.2表格驱动对象模型

    稍微好一点的对象模型将数据和成员函数分开,在这个对象模型中将类的数据成员和成员函数分置在两个不同的table中,一个叫做datamember table另一个叫做function table对象本身只有指向这两个表的指针,就像下面图中的一样。虽然这个模型没有被使用但是function table却为后面的虚函数内存布局提供了参考。

     

    15.3 c++对象模型

    现在就要来说说我们目前的c++对象模型了,现在的对象模型相对比较复杂整个结构分成了五个区域,数据成员区域,vPtr虚表驱动指针区域,非static function member区域,static member区域,static function member区域。值得注意的是只有数据成员以及vPtr虚表驱动指针才存放到对象模型的内存结构中去,就像下图一样。

     

    看到这个模型就能解释为什么static数据成员和成员函数是属于类的而不属于某个对象,因为他们在整个类中只有一份实例。对象里面不会存在他们。此外也能解释为什么类中不管有多少个虚函数永远都只丢给它4字节的内存大小,因为虚函数再多指向虚表的驱动指针只有一个。这只是两个比较典型的例子,除此之外还有很多可以解释的问题,比如神奇的1byte问题等等。

  • 相关阅读:
    ora-01847:月份中日的值必须介于 1 和当月最后一日之间
    (转)ORACLE中关于外键缺少索引的探讨和总结
    (转) Oracle性能优化-读懂执行计划
    shutdown immediate 持久无法关闭数据库之解决方案
    Oracle11g adump目录下面.aud增长导致空间撑满无法删除导致CRS无法启动的解决方法
    linux几种常见的文件内容查找和替换命令
    unzip解压3G或者4G以上文件失败的解决方法
    IMP-00058: ORACLE error 1882 encountered
    AIX文件系统/var空间100%的问题
    html5手机网站需要加的那些meta/link标签,html5 meta全解(转)
  • 原文地址:https://www.cnblogs.com/malc/p/5854478.html
Copyright © 2011-2022 走看看