C++ 对象模型--1小窥
来源:互联网 发布:nginx php 500错误 编辑:程序博客网 时间:2024/05/16 16:02
1.0 概视
C与C++的差别:
C语言中变量和函数分离,语言本身没有支持“数据和函数”之间的关联性,我们称之为程序性的。C++则是用独立的“抽象数据类型(abstract data type ADT)”来实现,数据和函数都在一个集体里面。
空间成本差别:
成员变量相同的结构体变量和类变量(对象)拥有相同大小的内存空间。虽然类声明中有member function,却不出现在object中,每一个non-inline member function只会产生一个函数实体。至于每一个“拥有零个或一个定义”的inline function则会在其每一个使用者身上产生一个函数实体。C++在布局以及存取时间上主要的额外负担是由virtual引起(后续会提及),包括:
1. virtual function机制: 用以支持一个有效率的“执行期绑定”(runtime binding)
2. virtual base class:用以实现“多次出现在继承体系中”的base class,有一个单一而被共享的实体
出现在object中,每一个non-inline member function只会产生一个函数实体。至于每一个“拥有零个
或一个定义”的inline function则会在其每一个使用者身上产生一个函数实体。C++在布局以及存取时
间上主要的额外负担是由virtual引起(后续会提及),包括:
1. virtual function机制: 用以支持一个有效率的“执行期绑定”(runtime binding)
2. virtual base class:用以实现“多次出现在继承体系中”的base class,有一个单一而被共
享的实体
此外还有一些多重继承下的额外负担,发生在“一个derived class和其第二或后续之base class的转换”
1.1 对象模式
C++中data member类型分为static和nonstatic,member function分为static、nonstatic和virtual
C++对象模型:
nonstatic datamembers被配置于每一个object之内;static data members被存放在所有的class object之外;static和nonstatic function members被存放在所有的class object之外;
virtual table以两个步骤支持:
1.每一个class产生一堆指向virtual functions的指针,这些指针放在一个表格中,这个表格被称作
virtual table(vtbl)
2.在每一个class object中添加一个指针,指向相关的virtual table,这个指针被称作vptr 。
vptr的设定和重置都有每一个class的constructor、destructor和copy assignment运算符启动完成。
另外,每一个class所关联的type_info object(用以支持Runtime type identification,RTTI)也经由virtualtable被指出,通常放在vtbl的第一个slot。
继承相关模型:
C++支持单一继承、多继承和虚继承;
C++采用的继承模型中,base class object的data member被放置在derived class object中,这样提供了对base class members最有效率的存取。缺点也是显而易见的,就是base class中member有所改变,所有用到该base class的derived class全部都需要被编译过。不过我认为相对于直接在运行阶段耗时,不如在编译阶段的耗时来替代。
- C++ 对象模型--1小窥
- Objective-C对象模型
- Objective-C对象模型
- objective C 对象模型
- C ++ 对象模型
- Objective-C 对象模型
- 【C++】对象模型
- Objective-C对象模型
- C/C++的对象模型
- Objective-C的对象模型
- 图解Objectvie-C对象模型
- C/C++的对象模型
- QT对象模型和一个小细节
- Objective-C对象模型--类对象和元类对象
- C++对象模型(1)
- C++对象模型1:
- 深度探索C++对象模型
- Objective-C 对象和消息模型
- 单源最短路(dijkstra)
- 横向滑动
- VLC RTSP视频播放终极解决方案
- JavaScript 隐式转换
- 1、JQuery——选择器
- C++ 对象模型--1小窥
- vue中关于computed的理解及其其他扩展
- 简述mybatis和hibernate的区别
- s5pv210-Linux驱动之USB鼠标
- 开始使用ABP.CORE模板 (ASP.NET Core with Angular)
- 【C++】多态机制的剖析!!!
- jpgraph
- jQuery遍历table并操作元素
- 在Android O上启动Service遇到问题记录