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

change in base class requiring recompilation of derived

本文关键字:派生 基类 编译 新编译      更新时间:2023-10-16

in Bjarne的" c++…"我刚读到

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

美元12.4.3 p.318

的大小?或者说总体上的变化?

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

我认为Bjarne试图得到的是,从内存布局的角度来看,派生通常是作为聚合实现的。例如,如果您以这样的内容开头:

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

b的内存布局如下:

| X | Y | a | b |

…因此,当/如果A的大小发生变化时,B的成员将在复合对象中以不同的偏移量存储。

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