1.C++的封装并不会增加布局成本,数据封装和普通结构体一样·,而行为封装,也不会增加。因为非内联函数,只会诞生一个实例。但是内联函数,则会在每一个使用者上诞生一个实例。
C++在布局上的额外负担主要是由virtual机制引起的:
(1)Virtual Function机制
(2)Virtual base class机制
(3)还有就是多重继承下产生的额外负担
C++中,有两种数据成员,静态和非静态。有三种成员函数,静态,非静态和虚函数。
2.第一种对象模型(简单对象模型)
就是在模型中,只保留类内各成员的指针,完全通过指针进行索引。
这样可以避免”members有不同的类型,因而需要不同的存储空间”所招致的问题。
而,一个类对象的大小也很好确定,它的成员的数量乘以指针的大小即可。
3.第二种对象模型(表格驱动对象模型)
在这个提出的模型里,我们将所有与成员相关的信息提取出来,放在一个数据成员表盒一个成员函数表中。而对象本身则内含指向两个表的指针。成员函数表中是一系列接口,每个接口指向对应的成员函数。数据成员表中则是直接存放的数据本身。
4.第三种对象模型(C++对象模型)
在这个模型里,非静态数据成员被分配在每个类对象中,静态数据成员在存放在所有对象之外。静态成员函数和非静态成员函数都存放在对象之外,及所有对象公有一份实例。
虚函数则用两个步骤支持:
1.每一个类产生一堆指向虚函数的指针存放在表格中,称为虚函数表virtual table(vtbl)
2.每一个类对象被安插一个指针,指向相关的虚函数表。通常这个指针被称为vptr。
5.一个类对象的大小包括
a) 非静态数据成员的大小
b) 内存补齐所占有的空间
c) 虚机制额外的内存开销