Inside_Cplusplus_对象

参考资料:

深度探索c++对象模型第一章


c++对象

  • 成员函数:
    • 非内联: 只会诞生一个函数实体,不在object中
    • 内联: 在每一个使用者上产生一个函数实体;

1 c++对象模式

data member:

  • static
  • non-static

成员函数:

  • static
  • nonstatic
  • virtual

1.1 c++对象模型

  • 指定多个access sections,内含数据:处于用一个access section的数据,必定保证其声明次序出现内存布局中;

1.1.1 成员数据

  • nonstatic 成员数据放在每一个class object中;
  • static成员数据 放在所有的class object之外;

1.1.2 成员函数

  • static和nonstatic 都放在class object之外;

对于虚函数:

  • 1).每一个class产生一个virtual function 的指针,放在表格中,这个表格就是虚函数表(virtual table)vbtl
  • 2). 每一个class添加一个指针,指向虚函数表 : 指针为vptr(设定和重置通过构造函数和析构函数完成)

  • 每一个class 关联的type_info 对象放在虚函数表的第一个表格;

1.2 多重继承

  • 继承:每一个子类中都包含一个基类实体;
  • 虚拟继承: 永远只会存在一个实体;

对于一个继承:

  • 每一个派生类对象中都包含一个指向基类表的指针;
  • 表中的每一个表格包含一个基类对象的指针;

1.3 对象的内存布局

  • nonstatic data member
  • 支持virtual而产生的负担
  • alignment的需求的填补(可能存在members之间,也可能存在边界)

2. 对象的差异

2.1 指针的转型

  • 对于一个指向某地址的void*指针,只能知道指向的地址,但是不知道通过它操作的object的类型;因此,无法通过void*指针操作object;

  • 转型: 一种编译器指令;大部分情况并不改变指针的指向的真正地址,只是影响“被指出的内存的大小和其内容”的解释方式;

2.2 多态的指针

对于两个类:

对于以下对象b,指向Bear的指针 pb, rb,对象和指针的内存布局:

给予一个Bear指针和ZooAnimal指针:

对于对象中的虚函数:

  • 运行时决定;