需要重新编译派生类的基类更改

时间:2012-12-28 15:04:50

标签: c++ implementation

在Bjarne的“C ++ ......”中,我刚刚读到了

  

大多数C ++实现的工作方式意味着基类大小的改变需要重新编译所有派生类

$ 12.4.3 p.318

的大小?或者更改一般?

1 个答案:

答案 0 :(得分:3)

在典型情况下,大小的改变需要重新编译所有派生类。其他更改也可能需要重新编译派生类(例如,更改成员的顺序和/或类型可能需要重新编译,即使大小保持不变)。

我认为Bjarne试图获得的大部分内容是,从内存布局的角度来看,派生通常是作为聚合实现的。例如,如果您从以下内容开始:

struct A { 
   int x;
   int y;
};

struct B : A { 
   int a;
   int b;
};

B b;

b的内存布局如下:

| X | Y | a | b |

...所以当/ A的大小发生变化时,B的成员将存储在复合对象的不同偏移处。

对于典型的构建系统,对包含基类定义的头的任何更改都将导致重新编译所有派生类,无论更改是否需要重新编译(即,如果头具有更多内容)最近的更改日期比依赖它的源文件更新,源文件将被重新编译,即使所有更改的文件都是,例如,根本不会对代码产生任何影响的注释。