语言的学习(10)--类的成本

来源:互联网 发布:夜息seo 编辑:程序博客网 时间:2024/05/16 09:29

类主要包括了三个核心的概念界面(封装思想),继承,多态的思想。继承主要的目的在于自动复制已有的代码。多态性的目标就是为了使用统一的接口各种不同类型的操作.在本文中主要讨论C++ 的类的实现成本。

 

C++OO的支持:基本类,单一/多重继承,单一继承带虚函数,多重继承带虚函数,虚基类

实现的成本的考察包括:对象空间成本,对象数据的存取成本,函数的成本。

 

基本类

单一/多重继承

单一继承带虚函数

多重继承带虚函数

虚基类

对象空间成本

 

基本的对象空间成本和结构体以及一般变量相同

同基本类不变

多出vptr和一个虚函数表

n-1个虚函数指针
n-1个虚函数表
thunk
assemble的代码段

n-1个虚函数指针
n-1个虚函数表
thunk
assemble的代码段

虚函数表多指向虚基类的offset

对象数据的存取成本

 

基本结构体的存取效率(主要是编译阶段可以确定基地址和offset

运行阶段效率相同 但对于多重继承编译阶段需要调整this指针

运行阶段效率相同但对于深度继承编译阶段需要调整this 指针

运行阶段效率相同 但编译阶段需要调整this指针

运行效率比基本类型低需要做间接寻址(二次读内存)

函数成本

(静态函数和非虚成员函数效率与一般非类函数相当)

 

基本不添加函数成本

基本不添加函数成本

需要间接寻址两次一次vptr一次 虚函数表

对于次要函数表需要三次寻址以一次Thunk运行。次表的顺序是先到主表与运行thunk 然后再到次表当中找虚函数位置

非虚基类虚函数同多重继承。对于虚基类则再需要一个链接。

 

注:所以虚基类最好没有对象成员

注:

以上说的效率都是指运行阶段效率编译阶段的成本没有考虑。

继承主要是指公有继承的成本没有考虑包含,私有继承,保护继承

这里成本消耗是Lippman 在《Inside C ++ model》讨论的对象模型所带来的成本,不同的编译器实现可能有不同的成本

四 这里没有考虑构造函数,拷贝构造函数,析构函数对类的成本的影响

原创粉丝点击