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