您的位置:首页 > 编程语言 > C语言/C++

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虚表指针);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: