一 C++对象模式
C语言对于程序员的吸引就在于精瘦和简易(leanness and its relative simplicity.)毕竟C++中的封装概念和模板等对于新手有些苦难。
C++中的类成员函数虽然声明在类(class)中,但却不在对象(object)中,每个非内联函数只会诞生一个函数实体,每个拥有0个或1个定义的内联函数会在其每一个使用者上产生一个函数实体。C++中的布局和存取时间上的额外开销(primary layout and access-time overheads )主要是由virtual引起的,包括(1)virtual funtion机制,支持动态绑定。(2)virtual base class,使多次出现在继承体系中的基类只有一个单一共享的实体。
类成员有两种:static和nonstatic。成员函数有三种:static,nontatic和virtual。
C++对象模型中nonstatic数据成员被置于每个object内,static数据成员则放在所有object之外;static和nontatic成员函数也放在素有object之外,virtual函数则以下面的虚函数表支持:
(1)所有指向虚函数的指针被放在一张表里,此表称为virtual table(vtbl)
(2)每一个含有虚函数的class object内添加一个指针,指向其vtbl,通常称此指针为vptr,它的 setting和resetting都由每个class的constructor,destructor和copy assignment运算符自动完成,每一个class所关联的type_info object(RTTI中需要用到),也经由virtual table指出,通常放在表的第一个slot处。
二 关键词的差异。(提到在第三章会有详细探索)
C中,把一个数组放在结构体的尾端,该数组可通过动态申请内存拥有可变长度
C++中,却有差异,首先含有多个access section,可能由基类派生而来,再或含有一个或多个虚函数。
处于一个access section 的数据成员可以保证其按照声明顺序出现在内存布局中,但多个access section中的成员排列顺序就不一定了。故上述C中的技巧或许可用或许不可以用。
三 对象的差异
C++通过以下方法支持多态:
(1)隐式转换,把一个derived class指针转化为一个纸箱其public base type 的指针
base *bp = new derived();
(2)virtual function机制
bp->function();
(3)dynamic_cast和typeid运算符
多态主要用于经由一个共同接口来影响类型的封装,此接口通常定义在抽象的 base class中。
一个class object 需要多少内存取决于:1. nonstatic数据成员总和的大小。 2.边界补齐所填充的空间。 3.支持virtual机制带来额外负担。
阅读(549) | 评论(0) | 转发(0) |