大多数C ++实现的工作方式意味着基类大小的改变需要重新编译所有派生类
$ 12.4.3 p.318
的大小?或者更改一般?
答案 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
的成员将存储在复合对象的不同偏移处。
对于典型的构建系统,对包含基类定义的头的任何更改都将导致重新编译所有派生类,无论更改是否需要重新编译(即,如果头具有更多内容)最近的更改日期比依赖它的源文件更新,源文件将被重新编译,即使所有更改的文件都是,例如,根本不会对代码产生任何影响的注释。