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

2014-11-24 07:44:37 · 作者: · 浏览: 0

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 
  
     
    #include 
   
     #include 
    
      using namespace std; class B{ public: virtual void test0(){ cout<<"B test0"<
     
      

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双重任务。