深度探索C++对象模型之Data语意学读书笔记

来源:互联网 发布:正规淘宝刷平台有哪些 编辑:程序博客网 时间:2024/06/03 20:51

3.4继承与Data Member

只要继承不要多态 

测试源码

class Concrete1{public:      // ...private:      int val;      char bit1;};class Concrete2:public Concrete1{public:     // ...private:     char bit2;};class Concrete3:public Concrete2{public:     // ...private:     char bit3;};

对于此例子,使用VC++编译,程序运行结果与书中讨论相符,sizeof(Concrete3)为16。使用GCC编译,结果不符,sizeof(Concrete3)为8。

可见,gcc在这里进行了特殊的优化。真正涉及到类似问题,不能轻易下结论,不同编译器可能有所不同。

如果大家知道GCC做了什么样的优化,请给我留言啊。我个人认为两个编译器提供的默认operator=函数可能行为不同。

加上多态

测试源码

    #include <iostream>      #include <typeinfo>      #include <cstdio>    using namespace std;      class B{      public:          virtual void test0(){              cout<<"B test0"<<endl;          }          virtual ~B(){              cout<<"B dctor"<<endl;          }      };        class A:public (virtual) B{      public:          int id;        virtual void test1(){cout<<"test1"<<endl;}          virtual void test2(){cout<<"test2"<<endl;}          virtual ~A(){cout<<"A dctor"<<endl;}            };      int main(){          A a;         printf("%p",&A::id);         cout<<sizeof(A)<<endl;         cout<<typeid(a).name()<<endl;          void (***p)() =(void (***)())&a;          typedef void (*fun)();          fun fp1=p[0][0];          fp1();         }  


1.GCC和VC++均把vptr放置在对象的头部

2.vptr指向的virtual table里有一个slot,用以支持runtime type identification,但GCC和VC++并没有把slot放置在下标为0的位置。

虚继承

VC++使用虚继承对象尺寸增加一个指针大小,使用virtual base class table技术,引入一种新型指针。

GCC引入虚继承对象尺寸并没有增大,猜测有可能使用virtual function table中放置virtual base class的offset技术,复用vptr,赋予vptr和vtbl双重任务。

0 0