【深度探索C++对象模型读书笔记】【第1章】关于对象

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

1virtualfunction机制,用以支持一个有效率的“执行期绑定”

2virtualbase class,用以实现“多次出现在继承体系中的baseclass,有一个单一而被共享的实例”;

3)多重继承下的额外负担,发生在“一个派生类和其第二个或后继之基类的转换”之间。

2、   c++中,有两种数据成员:staticnonstatic,三种成员函数:staticnonstaticvirtual

3、  例子:

class Point{
public:
	Point(float xval);
	virtual ~Point();
	float x() const;
	static int PointCount();
protected:
	virtual ostream& print(ostream& os) const;
	float _x;
	static int _point_count;
};
简单对象模型:一个对象是一系列的slots,每个slots指向一个members


表格驱动对象模型:把data直接放在data member table中,memberfunction table是一系列的slots,每一个slot指出一个memberfunction,一个对象含有指向两张表格的指针。


c++对象模型:nonstatic data members被置于类对象之内,而static data members被置于类对象之外。static和nonstatic functionmembers被放在类对象之外。virtual函数则由如下步骤支持:

1)每个class产生一个vtbl(虚函数表),vtbl中存放其类的类型type_info信息和虚函数指针;

 2)对象内添加一个指向vtbl的指针vptrvptr的设定和重置由类的构造函数、析构函数以及拷贝赋值运算符自动完成。


4、  在虚拟继承的情况下,基类不管在继承串链中被派生(derived)多少次,永远只会存在一个实例(称为subobject)。

5、  在纯C中,struct没有private data,也没有成员函数,只是一个数据的集合体。

6、  类中处于同一个accesssection中的数据,必定保证以其声明次序出现在内存布局中。不同的accesssection中的各笔数据,其排列顺序不一定。同理,基类和派生类的数据成员布局也没有要求谁先谁后的强制规定。

7、   C++程序设计模型支持3种编程模型:

1 程序模型(procedural model

2)抽象数据类型模型(ADT

3)面向对象模型(OO

8 虽然可以直接或间接处理继承体系中的一个base class object,但只有通过pointerreference的间接处理,才能支持OO程序设计所需的多态性质。

9C++以下列方法支持多态:

1经由一组隐式的转化操作,如把一个derived class指针转化为一个指向其public base type的指针;

2经由virtual function机制;

3经由dynamic_casttypeid运算符。

10一个class object所需的内存包括:

1  nonstatic数据成员的总和大小;

2 任何由于alignment需求而填补上去的空间;

3 为支持virtual而由内部产生的任何额外负担。

11指向不同类型之各的指针的差异,既不在其指针表示法不同,也不在其内容不同,而是在其所寻址出来的object类型不同,也就是说指针类型会教导编译器如何解释某个特定地址中的内存内容及大小。

12  转型(cast是一种编译器指令,大部分情况下它并不改变一个指针所含的真正地址,它只是影响被指向之内存的大小和内容的解释方式。

13、一个基类对象被直接初始化或指定为一个子类对象时,子类对象就会被切割以塞入较小的base type内存中,多态于是不再呈现。


原文地址:https://www.cnblogs.com/ruan875417/p/4558285.html