在 Bjarne 的“C++ ...”中,我刚刚读过
大多数 C++ 实现的工作方式意味着基类大小的变化需要重新编译所有派生类
$12.4.3 p.318
在大小?或者更确切地说是总体上的变化?
在 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
将存储在复合对象中的不同偏移量处。
对于典型的构建系统,对包含基类定义的标头的任何更改都将导致重新编译所有派生类,无论更改是否需要重新编译(即,如果标头具有更新的更改日期与依赖它的源文件相比,源文件将被重新编译,即使所做的所有更改都是,例如,对代码没有任何影响的注释)。