C++的对象模型,有考虑以下几点:
与c语言的兼容
如c的struct的兼容。还有什么呢?
c++语意
- c++对象体系主要有以下部分:
scalar→c struct→class→单一继承→{加上多态(vptr、vtbl)多重继承/虚拟继承(vbc?)
多态用以支持执行期的绑定,OO面向对象范式的编程。
虚拟继承可以看作是对于多重继承的优化,以节省空间。 static nonstatic
- static data member 可以视作全局变量。独立于class object之外。
- nonstatic data member 则放置在一块,视为class object之内,存取类似于数组(或struct:要考虑到aligment)。存取效率还是比较高的。
为了支持virtual function还有virtual base class。这两个需要执行期绑定的特性——两者编译后并不确定具体对象类型(当使用指针或者引用的时候),因此,一个不知道具体引用到了哪个virtual function(存放函数地址),一个不知道具体的基类对象data member的offset。故不宜采用第2点所说的那样。采取的方法一个是vptr+vtbl,
思考:可以比较如下几个。
a:int a; char b;float * c;
b:struct A{int a;char b;float * c} cstuct;
.
c:class base {public:char b;};
class B:public virtual base {int a;float *c;};
那么引用a、b、c中char b有什么区别?
时间空间效率
alignment 是为了提高运算的效率。可以参考Data alignment及struct size深入分析:Data Alignment 并非针对 Data 本身,而是Data(Variable)的内存地址。几乎所有的programming language。
在class object直接存放nonstatic data member,而不是存放一个个指针(简单对象模型),用取用的时候直接引用名(di)字(zhi)加上一个固定的offset(对象模型)即可。这样既可以既可以节省空间(存放指针),也可以节省时间(通过指针引用数据:可以类比:数组、链表)。
——《深度探索c++对象模型》