《深度探索C++对象模型》chapter1:关于对象

前言

什么是C++对象模型?

  1. 语言中直接支持面向对象程序设计的部分
  2. 对于各种支持的底层实现机制

1 关于对象

1.0 加上封装后的布局成本

  1. 成员函数不占用类对象的内存空间

  2. 一个类对象至少占用1个字节的内存空间

  3. 成员变量是占用对象的内存空间

  4. 成员函数 每个类只诞生 一个(跟着类走),而不管你用这个类产生了多少个该类的对象;

C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括:

  1. virtual function机制,用以支持一个有效率的“执行期绑定”
  2. virtual base class用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实例”

1.1 C++对象模式

在这里插入图片描述

  1. 每一个class产生出一堆指向virtual function的指针,放在表格(virtual table:vtbl)之中。
  2. 每一个class object被安插一个指针,指向相关的virtual table。通常这个指针被称为vptr

1.1.1 派生类如何模塑其基类实例?

每一个class object内含一个bptr,它会被初始化指向其base class table,base class table表格中的每一个slot内含一个相关的base class地址。

缺点:由于间接性而导致的空间和存取时间上的额外负担

“间接性”的级数将因为继承的深度而增加

不考虑间接性的继承模型:

优点:提供了对基类成员最紧凑且高效的存取

缺点:基类成员的任何改变都会使所有用到“此基类或其派生类对象”者重新编译

1.2 C++中的多态

  1. 经由一组隐式的转化操作。例如把一个派生类指针转换为一个指向其基类类型的指针:shape *ps = new circle()
  2. 经由虚函数机制:ps->rotate()
  3. 经由dynamic_cast和typeid运算符:if(circle *ps = dynamic_cast<circle*> (ps)) ...

1.3 需要多少内存以表现一个class object?

  1. nonstatic data members的总和大小
  2. 加上由于 alignment的需求而填补上去的空间(可能存在于members之间,也可能存在于集合体边界)

alignment就是将数值调整到某数的倍数。在32位计算机上,通常alignment为4 bytes(32位),以使bus的“运输量”达到最高效率

  1. 加上为了支持virtual而由内部产生的任何额外负担(overhead)

1.4 class的object布局和pointer布局

class ZooAnimal {
public:
    ZooAnimal();
    virtual ~ZooAnimal();
    //...
    virtual void rotate();
    
protected:
    int loc;
    String name;
};

ZooAnimal za("Zoey");
ZooAnimal *pza = &za;

在这里插入图片描述

class Bear : public ZooAnimal {
public:
    Bear();
    ~Bear();
    //...
    void rotate();
    virtual void dance();
    //...
protected:
    enum Dances {...};
    
    Dances dances_known;
    int cell_block;
};

Bear b("Yogi");
Bear *pb = &b;
Bear &rb = *pb;

在这里插入图片描述
依序定义下的内存布局:
在这里插入图片描述
当基类对象被直接初始化一个派生类对象时,派生类对象会被切割以塞入较小的基类型内存中,派生类将没有留下任何痕迹,不满足多态。

1.5 OO与OB

面向对象:C++通过class的pointers和references来支持多态

OB(object-based):C++也支持具体的ADT程序风格,提供public接口和private实现品,但不支持类型扩充。

一个OB设计可能比一个对等的OO设计速度更快而且空间更紧凑

速度快:所有的函数调用操作都在编译时期解析完成,对象建构起来不需要设置virtual机制

空间紧凑:每一个class object不需要负担传统上为支持virutal机制而需要的额外负担

不过,OB设计缺乏弹性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值