c++ object model

对一个结构体进行不断的封装后可以形成一个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 ;             }

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

A objA ;  
A * ptr = & objA ;  ptr->foo( ) ;   
objA.foo() ;  
//分别被转换为:  
foo_intA( ptr ) ;  
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

 

转载于:https://www.cnblogs.com/13224ACMer/p/6284044.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9008刷机怎么刷_OV快捷进入高通进9008或fastboot模式刷机解锁,和MTK关机解锁

不喜略过。高通进9008刷机解锁:关机状态下,同时按音量下键上键插线进9008 .(注意安装手机驱动)高通进fastboot模式解锁:旧机型(平台上选择不到机型的)进fast解锁,关机状态 音量下键开机键 MTK关机解锁:关机状态下按音量上键&#…

10年内,19个关键技术将改变世界

来源: 科技联盟技术中心据国外媒体报道,从无人驾驶汽车到机器人工人,在我们熟悉所有这一切之前,未来正迎面走来。根据世界经济论坛全球议程理事会关于《未来软件与社会》的一份报告,到2025年前,很多新兴技术…

scope参数错误或没有scope权限_SSM 单体框架 - 前端开发:用户和权限模块

用户管理分页 & 条件查询用户数据查询条件1. 用户手机号 2. 注册时间,包含开始日期和结束日期日期选择器组件在查询条件中使用了 Element UI 中的日期选择器:https://element.eleme.cn/#/zh-CN/component/date-picker#mo-ren-xian-shi-ri-qi在测试项目中创建一个…

武器化道路越走越远的无人机

来源:雷擎科技在数以千计的军用无人机中,绝大部分都用于监视。国防专家预测这种情况将会一直存在。Janes的分析师预计,在未来10年内,全球将购买超过80,000架监视无人机和近2,000架攻击无人机。武器化的无人机并不便宜。专家表示&a…

怎样查看cudnn版本_ubuntu16.04+Geforce GTX1060安装CUDA和cuDNN

DELL G7系列,ubuntu16.04,本机显卡型号: GeForce GTX 1060。主要步骤如下:一,安装NVIDIA驱动。1,本笔记本是F12进入BIOS,将secure boot设置为disable。2,通过下面命令确保电脑上之前的nvidia驱动…

Unity3DGUI:Window

#pragma strictvar winRect:RectRect(30,100,150,200);var windowShow:booleantrue;function OnGUI () { windowShowGUI.Toggle(Rect(10,10,100,20),windowShow,"窗口显示"); if(windowShow) //参数:windowID,位置,回调函数&#x…

android分享文件分享结果_干货分享丨DM删除归档日志文件的多种方法

上一期我们讲解了DM数据库归档日志的切换,本期我们讲解DM数据库归档日志文件的删除。本章内容已在如下环境上测试:①操作系统:中标麒麟7;②数据库版本:达梦8;相关关键字:DM数据库、归档日志文件…

三个维度看全球半导体格局变迁

来源:世纪证券费城半导体指数(SOX) 的发展阶段反应了全球半导体的走势与兴衰更替。费半指数涵盖全球半导体设计、设备、制造、 材料等方向, 其走势可以是衡量全球半导体行业景气程度的主要指标。费城半导体指数发行于在 1993 年12…

alot英文怎么读_很多的英文怎么说

你知道吗?一起来学习一下吧!很多的英文:可数:a lot of, lots of, many不可数:a good/great deal of , a good/ great amount of两者皆可:a large quantity of, quantities of同义词辨析:a lot of 和 lots of &#xf…

用samba来创建windows下的文件共享

前言 Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块 ,SMB主要是作为Microsoft的网络通讯协议,后来Samba将SMB通信协议应用到了Linux系统上,就形成了现…

go 微服务框架_清晰架构(Clean Architecture)的Go微服务

更新我最进对这个框架进行了重大升级,虽然所做的改动不大,但成效显著。这次更新修复了旧框架中的所有主要问题,尽管它的的主要项目结构和接口都没有改变,具体改动内容请参见清晰架构(Clean Architecture)的…

贝叶斯网络之父Judea Pearl力荐、LeCun点赞,这篇长论文全面解读机器学习中的因果关系...

来源:机器之心作者:Bernhard Schlkopf图灵奖得主、贝叶斯网络之父 Judea Pearl 曾自嘲自己是「AI 社区的反叛者」,因为他对人工智能发展方向的观点与主流趋势相反。Pearl 认为,尽管现有的机器学习模型已经取得了巨大的进步&#x…

了解Web及网络基础——《图解http》第一章

1. 现在已提出的三项WWW构建技术,分别是把SGML作为页面的文本标记语言的HTML;作为文档传递协议的HTTP;指定文档所在地址的URL(统一资源定位符)。* 2. 网络基础:TCP/IP。通常使用的网络是在TCP/IP协议族的基…

python中如何连接两个字符串_python字符串连接的N种方式总结

python中有很多字符串连接方式,今天在写代码,顺便总结一下:最原始的字符串连接方式:str1 str2python 新字符串连接语法:str1, str2奇怪的字符串方式:str1 str2% 连接字符串:‘name:%s; sex: %…

tomcat防cc_浅析Tomcat防止资料被锁的方式

在Windows平台的Tomcat上部署应用后,应用下的个别文件可能会被Tomcat锁住,解部署的时候删除不掉那些内容,就会导致无法重部署。如果解部署删除不掉被锁的文件,Tomcat会在日志中警告说:2013-1-9 15:44:09 org.apache.ca…

python怎么发送微信给自己_Python新手教程:Python微信定时自动给【女朋友】发送天气预报...

效果图主要思路1.从wxpy获取好友列表2.创建定时器3.定时器触发函数4.函数执行,遍历好友列表5.好友对象执行带参函数,参数为该好友城市6.函数中请求百度天气接口,得到该好友对应天气数据,解析处理数据,发送天气信息&…

Science子刊带来新遗传证据:早期人类驯化了自己

来源:中国生物技术网在开始驯化狗、猫、绵羊和牛等动物前,人类可能已经有了驯化一种完全不同动物的传统,就是我们人类自己。近日,发表在《Science Advances》上的一项新研究引用从某种程度上反映驯化元素的一种疾病的遗传证据表明…

简单的HTTP协议——《图解http》第二章

2.1 HTTP协议用于客户端和服务端直接的通信 在一条通信线路上必定一端是客户端,另一端则是服务端。 2.2 通过请求和响应的交换达成通信。 HTTP协议规定,请求从客户端发出,最后服务器响应该请求并返回。 请求报文的构成和解读。 请求报文是由请…

nacicat for mysql查询_navicat for mysql怎么用

navicat简单的使用方法:1、创建数据库:选中连接名,右键,点击新建数据库。2、删除数据库:选中要删除的数据库,右键,点击删除数据库。3、创建数据表:双击test01,选中表,右键…

字节跳动开发者工具_FAQ | 字节跳动小游游戏发布常见问题汇总

在说常见问题之前,我们先强调2点字节跳动小游戏的基础技术限制(这个很重要,请认真阅读):第1:不允许操作 DOM、BOM,必须改成平台相应的 API 调用方式;第2:不允许动态执行代码的能力,e…