第一章 关于对象

简单对象模型(A Simple Object Model)


一个objects是一系列的slots。
members本身不放在object中,只有指向member的指针放在object中。
​ 避免members有不同类型,因而需要不同的存储空间所招致的问题
Object中的members是以slot的索引值来寻址。



用于C++指向成员的指针概念之中

表格驱动对象模型(A Table-driven Object Model)


屏幕快照 2017-04-28 下午8.09.27.png

用于virtual functions的一个有效方案

C++对象模型(The C++ Object Model)


Class object内: nonstatic data members
Class object外: static data members、static and nonstatic function members
Virtual functions:

  • vtbl 存放每一个class生成的指向vf的指针
  • 每一个class object 被添加一个指向vtbl的指针(vptr),设定和充值都由每一个class的构造、析构和拷贝运算符自动完成
  • 每一个class关联的type_info object(用以支持runtime type identification,RTTI)也经由vtbl被指出来
屏幕快照 2017-04-28 下午8.23.00.png

继承模型:

  • 直接继承:base class subobject的data members直接放置于derived class object中
    优点:紧凑而且有效率的存取
    缺点:基类成员改变都导致派生类的重新编译
屏幕快照 2017-04-28 下午10.02.19.png
  • 虚拟继承:多重继承中特有的概念,在派生类中加入虚类指针(增加寻址时间,相当于以时间换空间)
    class A
    class B1:public virtual A;
    class B2:public virtual A;
    class D:public B1,public B2;
    虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,也并不常用,而一旦离开了多重继承,虚拟继承就完全失去了存在的必要因为这样只会降低效率和占用更多的空间。

C++程序设计模型


  1. 程序模型(procedural model)
  2. 抽象数据类型模型(abstract data type model,ADT)
    提供一组表达式(public 接口),重载运算符操作
  3. 面向对象模型(object-oriented model)
    继承,共同相关类型由抽象基类封装起来
    通过指针或者引用来间接处理基类对象才体现多态

C++支持多态的方法:

  • 经由一组隐含的转化操作
    例如:shape *ps = new circle()
  • 经由virtual function机制
    例如:ps->rotate()
  • 经由dynamic_cast 和typeid运算符
    例如:circle *pc = dynamic_cast< circle* > (ps)

Class object的内存占用

  • 其 nonstatic data members 的总和大小
  • 对齐所填补的空间
    在32位计算机上,通常alignment位4bytes(32位),以使bus的“运输量”达到最高效率
  • 支持virtual而产生的额外负担
    指针类型告诉编译器如何解释某个地址中的内存内容及其大小,转型(cast)就是影响解释方式
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 对象模型 1.1 简单对象模型 每个slot指向一个members,包括数据以及函数members本身不在o...
    厝弧阅读 2,286评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,553评论 19 139
  • Introduction to C++ (Season 1) Unit 1: Overview of C++ 第1...
    我是阿喵酱阅读 7,680评论 0 7
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,846评论 0 9
  • 成语背水一战的故事,汉高祖三年(公元前204年)十月,汉将军韩信率军攻赵,穿出井陉口,命令将士背靠大河摆开阵势,与...
    瞎写一通与乱写一气阅读 3,895评论 3 4