《深度探索C++对象模型》读书笔记——第一章(关于对象)

来源:互联网 发布:软件怎么下载 编辑:程序博客网 时间:2024/05/22 04:48

1.C++的封装并不会增加布局成本,数据封装和普通结构体一样·,而行为封装,也不会增加。因为非内联函数,只会诞生一个实例。但是内联函数,则会在每一个使用者上诞生一个实例。

C++在布局上的额外负担主要是由virtual机制引起的:

(1)Virtual Function机制

(2)Virtual base class机制

(3)还有就是多重继承下产生的额外负担

C++中,有两种数据成员,静态和非静态。有三种成员函数,静态,非静态和虚函数。

 

2.第一种对象模型(简单对象模型)

就是在模型中,只保留类内各成员的指针,完全通过指针进行索引。

这样可以避免”members有不同的类型,因而需要不同的存储空间”所招致的问题。

而,一个类对象的大小也很好确定,它的成员的数量乘以指针的大小即可。

3.第二种对象模型(表格驱动对象模型)

在这个提出的模型里,我们将所有与成员相关的信息提取出来,放在一个数据成员表盒一个成员函数表中。而对象本身则内含指向两个表的指针。成员函数表中是一系列接口,每个接口指向对应的成员函数。数据成员表中则是直接存放的数据本身。

 

4.第三种对象模型(C++对象模型)

在这个模型里,非静态数据成员被分配在每个类对象中,静态数据成员在存放在所有对象之外。静态成员函数和非静态成员函数都存放在对象之外,及所有对象公有一份实例。

 

虚函数则用两个步骤支持:

1.每一个类产生一堆指向虚函数的指针存放在表格中,称为虚函数表virtual tablevtbl

2.每一个类对象被安插一个指针,指向相关的虚函数表。通常这个指针被称为vptr

5.一个类对象的大小包括

a) 非静态数据成员的大小

b) 内存补齐所占有的空间

c) 虚机制额外的内存开销

0 0
原创粉丝点击