3.9/2:



3.9/3:



我正式理解了这些规则,但是我很感兴趣这种限制的意义是什么?

最佳答案

基类子对象可能在派生类使用的末尾具有填充。给定两堂课

struct A {
  int a;
  char b;
};
struct B : A {
  char c;
};
sizeof(A) == sizeof(B)完全有可能。如果它们相等,则很显然,如果仅使用memcpy复制A子对象,事情就会中断:您将无法防止读取甚至覆盖c值。

您的实现可能会重复使用填充,也可能不会这样。在不重新使用填充的情况下设计ABI的一个正当理由就是恰好很好地处理了对此类子对象错误地使用memcpy的代码。

注释给出了一个带有空基类的示例。这是一种特殊情况,当前的实现很可能会重用基类的一个字节,但这不是唯一的允许时间。

09-10 00:49