C++实现机制(二)——编译器实现对象模型的方法
2010-08-04 11:40
721 查看
没错哦,从题目可以看出本章是讲述编译器构建Class的方法。
作为C++核心基础之一的class,了解编译器背后为其做了哪些,是认识C++底层实现机制的关键,同时我看到,很多人在各类文章的只言片语中,对其进行了大量的充满迷信和传说的诠释。
要讲class,就不得不说说struct,因为编译器在构建它们的数据成员的方法上是相似的。这也是我最想让你知道的,即“通过类封装数据和操作本身是绝对没有额外成本的,效率和空间的牺牲大部分在于虚表的维护”
回到正题,我们实际上可以认为struct是一个数据声明集合,对于struct来说数据分为两类:static data members和non-static data members。如果是non-static类型,当时构建struct object时,就将其配置在struct object之内,而static类型的则放在struct之外,即存储在程序的静态存储区。
举例来说:(抱歉虚表位置画错了,实际应在最顶端)
现在来讲class,对于class来说,它不但有数据成员(data members),还有函数成员(function members),上文我说过class的数据成员构建方法和struct是一样的,所以我们只说说函数成员,它分为三种:static、non-static和virtual,其中static和non-static声明与数据成员类似,若是non-static的函数成员则在class object内记录一个函数指针,函数体放在classobject之外,static的则直接放在静态储存区。
那么唯一特殊的就是virtual类型的函数成员,它通过在每一个class object尾部添加一个vptr指针,指向虚表(virtual table),该表维护继承、重载、运行时类型识别等功能。class的效率和空间牺牲基本都在这里。
举例:
通过上文我们可以看出,通过类来封装和操作本身并不会增加额外开销,真正的负担在于由于虚表,class object的结构可以理解为
class object=(类似struct object结构的data members)+
(类似data members的function members指针记录集合)+
(vptr虚表指针);
作为C++核心基础之一的class,了解编译器背后为其做了哪些,是认识C++底层实现机制的关键,同时我看到,很多人在各类文章的只言片语中,对其进行了大量的充满迷信和传说的诠释。
要讲class,就不得不说说struct,因为编译器在构建它们的数据成员的方法上是相似的。这也是我最想让你知道的,即“通过类封装数据和操作本身是绝对没有额外成本的,效率和空间的牺牲大部分在于虚表的维护”
回到正题,我们实际上可以认为struct是一个数据声明集合,对于struct来说数据分为两类:static data members和non-static data members。如果是non-static类型,当时构建struct object时,就将其配置在struct object之内,而static类型的则放在struct之外,即存储在程序的静态存储区。
举例来说:(抱歉虚表位置画错了,实际应在最顶端)
现在来讲class,对于class来说,它不但有数据成员(data members),还有函数成员(function members),上文我说过class的数据成员构建方法和struct是一样的,所以我们只说说函数成员,它分为三种:static、non-static和virtual,其中static和non-static声明与数据成员类似,若是non-static的函数成员则在class object内记录一个函数指针,函数体放在classobject之外,static的则直接放在静态储存区。
那么唯一特殊的就是virtual类型的函数成员,它通过在每一个class object尾部添加一个vptr指针,指向虚表(virtual table),该表维护继承、重载、运行时类型识别等功能。class的效率和空间牺牲基本都在这里。
举例:
通过上文我们可以看出,通过类来封装和操作本身并不会增加额外开销,真正的负担在于由于虚表,class object的结构可以理解为
class object=(类似struct object结构的data members)+
(类似data members的function members指针记录集合)+
(vptr虚表指针);
相关文章推荐
- C++插件机制的一种实现方法(对象工厂)
- C++对象模型Data语意学分析、虚继承底层实现机制
- 关于new和delete的编译器的内部实现---来自深度探索C++对象模型
- C++反射机制具体实现方法详解(转帖:原作者不详)
- paip.函数方法回调机制跟java php python c++的实现
- 基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
- 从内存模型角度来看C++多态实现机制
- JavaScript实现继承机制(1)—— 构造函数方法对象冒充
- C++对象模型之RTTI的实现原理
- 从内存模型的角度来看C++多态实现机制和C++析构函数为什么要用虚函数
- TensorFlow使用C++加载使用训练好的模型,.cc文件代码实现的相关类及方法总结
- C++对象模型之RTTI的实现原理
- C++对象模型之RTTI的实现原理
- C++面向对象特性实现机制的初步分析 Part2
- 深入理解C++对象模型-成员函数的本质以及虚函数的实现(非虚继承)
- C++面向对象特性实现机制的初步分析 Part3
- 【对象模型】C++模版的编译链接过程——编译器真的会检查所有tocken层面的错误么?
- 基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
- [转]浅析C++中虚函数的调用及对象的内部布局(利用汇编深刻理解C++虚函数底层实现机制)
- 深度探索C++对象模型-----编译器’何时‘自动合成nontrivial default constructor