对一个结构体进行不断的封装后可以形成一个c++类,为此需要添加很多函数成员之类的代码,为此显示c++比c语言显得庞大并且迟缓,但是事实并不是这些

c++在布局和时间上的额外承担主要是由virtual引起的

下面简述c++对象模型

数据成员包括静态成员和非静态成员,

函数成员包括静态,非静态,虚函数

--------------------------------------------

c++对象模型

(1)简单对象模型

每一个对象存储着若干个slots,每一个slots指向一个成员,这里面包括函数成员和数据成员,对于顺序,索引则按照他们的声明顺序进行排序

这样每一个成员都不存储在对象中,而是通过对象内的一个slots指针指向自己,这样可以解决因为数据成员的类型不同,而需要开辟不同的空间而导致的不必要的麻烦

这种模式很少被应用到工业中,但是slots得思想和索引的概念影响着其他的模型

(2)表格驱动对象模型(双表格模型)

此种模型将所有的数据成员抽象出来,讲date member直接存储放在一个表中,而member function 的slots放在另外一个表中,我们对象本身只有两个指针,一个指针指向数据成员,一个指针指向函数成员表,表中有一系列的slots,在通过slots找到各个函数,这里的机制就类似于简单对象模型

(3)c++对象模型:

此模型主要在简单模型的基础上进行了一些列的优化,首先对于数据成员:非静态的直接存储在object内部,对于静态的则存储在class外,

对于函数成员来说,静态成员函数和非静态成员函数也都存在类之外,对于虚函数(每一个object产生一个指针,指向virtual table,这个table内有一些列slots,分别指向各个虚函数)

优缺点:这个模型在存取时间和空间上的效率得到了改善,但是如果非静态数据成员进行了更改,那么程序需要重新编译。和双表格模型比较,其空间效率和时间更好,但是双表格模型由于中间又一次间接引用,所以即使非静态数据成员进行了更改,也没有问题,其弹性比较好

如果再次基础上,加上了继承的话,

那么我们可以在每一个object中增加一个bptr指针,每一个指针指向一个base table,table里面有一些列的slots,每一个slots指向一个base function

上面方法的缺点就是随着继承深度的增加,间接性的寻址,随着深度的增加时间也在增减,其时间和空间都消耗许多

优点就是其对于每一个object的继承方式都表现为一致性,无需改变class本身,都可以改变base class table,class object只需要一个bptr指向其base table就ok了

*****在c++对象模型的virtual table中的第一个索引是一个type_info for class 这这标记表示了我这个对象指向了哪一个类

eg:

A *P =NEW A()

A*P=new B()

第一种就是指向A,第二种就是指向B

但是对于c++对象模型来说,很多成员函数和静态成员都独立于对象存储,那么我们怎么找到他

对于static date member

它被编译器提出于class之外,并被视为一个global变量(但只在class生命范围之内可见)

每个静态数据成员只有一个实体,存放在程序的数据段之中,

经由’.’运算符,对一个静态数据成员进行存取操作,只是语法上的一种便宜行事而已。静态数据成员其实并不在class object之中,因此存取它并不需要通过class object。

虽然你可以不靠class object 来存取一个静态成员,但其存取函数却得绑定于一个class object之上。(若静态成员的访问控制为protected或private,则必须通过存取函数来访问)

成员函数的处理

C++的设计准则之一:非静态成员函数至少和一般的外部函数有相同的存储效率。

C++编译器会把成员函数内化为一般的函数:

①改写函数原型,安插一个额外的参数this指针。用以提供一个存取管道,使类对象得以调用该函数。

int A::foo (A* const this)

若该成员函数是const,则变成:

int A::foo (const A* const this)

②对函数体中 类对象的非静态数据成员的存取操作,改为经由this指针来存取。

int A::foo (A* const this)

{            return  this->val ;             }

③将成员函数重新写成一个外部函数,对函数名称进行处理,使它在程序中成为独一无二的。

  1. A objA ;
  2. A * ptr = & objA ;
  3.  
  4. ptr->foo( ) ;
  5. objA.foo() ;
  6. //分别被转换为:
  7. foo_intA( ptr ) ;
  8. foo_intA( & objA ) ;

静态成员函数的主要特征是它没有this指针,但是他仍然需要改一个新的函数名

故其:

①它不能够直接存取其class中的非静态成员

②它不能够直接被声明为const、virtual

③它不需要经由class object才被调用——虽然大部分时候它是这样被调用的。

  1. objA.staFun( ) ;
  2. ptr->staFun( ) ;
  3. //会转换为:
  4. staFun_staticintvoid( ) ;
  5. staFun_staticintvoid( ) ;

因为不需要this指针,所以他等同于外部函数,只不过他的内部操作成员都是类内的static data member

c++ object model的更多相关文章

  1. Selenium的PO模式(Page Object Model)[python版]

     Page Object Model 简称POM  普通的测试用例代码: .... #测试用例 def test_login_mail(self): driver = self.driver driv ...

  2. 在C#开发中如何使用Client Object Model客户端代码获得SharePoint 网站、列表的权限情况

    自从人类学会了使用火,烤制的方式替代了人类的消化系统部分功能,从此人类的消化系统更加简单,加速了人脑的进化:自从SharePoint 2010开始有了Client Side Object Model ...

  3. Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)

            研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...

  4. 解决在使用client object model的时候报“object does not belong to a list”错误

    在查看别人代码的时候,发现了个有意思的问题,使用client object model将一个文件check in 我使用的是如下语句获取file Microsoft.SharePoint.Client ...

  5. Page Object Model (Selenium, Python)

    时间 2015-06-15 00:11:56  Qxf2 blog 原文  http://qxf2.com/blog/page-object-model-selenium-python/ 主题 Sel ...

  6. SharePoint Client Object Model API 介绍以及工作原理解析

    CSOM和ServerAPI 的对比 SharePoint从2010开始引入了Client Object Model的API(后文中用CSOM来代替),从名字来看,我们可以简单的看出,该API是面向客 ...

  7. BOM (Browser Object Model) 浏览器对象模型

    l对象的角色,因此所有在全局作用域中声明的变量/函数都会变成window对象的属性和方法; // PS:尝试访问未声明的变量会抛出错误,但是通过查询window对象,可以知道某个可能未声明的对象是否存 ...

  8. 文本对象模型(Document Object Model)

    本文内容: 1. 概述 2. DOM中的节点类型 3. DOM节点的选取 4. 存取元素属性 5.DOM元素的增删 6.小结 ★ 概述 文本对象模型(DOM)是一个能够让程序和脚本动态访问和更新文档内 ...

  9. 浏览器对象模型(BOM,Browser Object Model)

    本文内容     1.概述     2.windows与document     3.对话框     4.定时调用     5.URL解析与访问历史     6.浏览器和屏幕信息 ★概述     &q ...

  10. 关于SharePoint 的Client object model该何时load和execut query的一点自己的看法

    很多人在用client object model的时候,不知道何时或者该不该load,今天看到一个观点描述这个问题,觉得很有道理,和大家分享.那就是写client object model就像写sql ...

随机推荐

  1. css权值问题

    继承是没有权值的,比通配符的的权值0还要低. 选择器是不分上下级的.只管优先级. 第一等:代表内联样式,如: style=””,权值为1000. 第二等:代表ID选择器,如:#content,权值为0 ...

  2. singnal 13 was raised

    在app运行过程中按下home键或者其他原因app被挂起,socket连接不会断开,服务器为了节省资源,在一段时间后会主动关闭这个连接.当玩家再次切回到游戏后,前端并不知道这个连接已经断开了,继续通过 ...

  3. 1237: [SCOI2008]配对

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1789  Solved: 715[Submit][Status][Discuss] Descripti ...

  4. 【PE】手动给PE文件添加一段代码MessageBoxA

    源程序是这个样子: 思路: 1.通过LordPE工具拿到所需数据 2.OllyDebug通过BP MessageBoxA拿到MessageBoxA地址 3.UE十六进制编辑器定位代码节基址 4.在代码 ...

  5. Maven - 配置镜像仓库

    默认仓库的配置(全球中央仓库): 可以打开maven的安装目录/conf/settings.xml文件,配置镜像,找到如下一段配置,这里默认没有配置任何镜像,但是有一个被注释的配置范例: id: 镜像 ...

  6. MySQL备份工具percona-xtrabackup安装

    1.安装xtrabackup的yum源 rpm -ivh https://www.percona.com/redir/downloads/percona-release/redhat/latest/p ...

  7. JAVAOOP集合框架

    集合框架三大内容:对外的接口.接口的实现和对集合运算的算法 集合有三大类接口:List.Set.Map 共同点:都是集合接口,都可以用来存储很多对象 不同:Collection接口存储一组不唯一(允许 ...

  8. MYSQL SQL高级查询技巧

    1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. ...

  9. php性能优化 --- laravel 性能优化

    1.laravel官方提供了一些优化(laravel 5.* 版本): (1).关闭debug,修改 .env 的  APP_DEBUG=false    (2).  sudo php artisan ...

  10. HyperLedger Fabric 1.4 比特币历史(1.1)

    比特币是一种数字货币,也是一种创新思维,把人们带入到一个无中心化.完全可信任.安全可靠的全新思维领域:一个叫“中本聪”的人或组织,使我们思维产生化学反应,他在2008年10月31日发表了比特币白皮书& ...