第一章 关于对象

来源:互联网 发布:电信宽带加端口要多久 编辑:程序博客网 时间:2024/06/06 09:27

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


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

这里写图片描述

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

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


这里写图片描述

用于virtual functions的一个有效方案

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

这里写图片描述
1. 内存分布:
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被指
2. 继承模型:

  • 直接继承:base class subobject的data members直接放置于derived class object中
    优点:紧凑而且有效率的存取
    缺点:基类成员改变都导致派生类的重新编译
    这里写图片描述
  • 虚拟继承:多重继承中特有的概念,在派生类中加入虚类指针(增加寻址时间,相当于以时间换空间)
    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)就是影响解释方式

0 0