1

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

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

$12.4.3 p.318

在大小?或者更确切地说是总体上的变化?

4

1 回答 1

3

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

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

struct A { 
   int x;
   int y;
};

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

B b;

的内存布局b将如下所示:

| X | Y | a | b |

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

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

于 2012-12-28T15:13:58.867 回答