gpt4 book ai didi

c++ - 为什么对基类子对象有限制?

转载 作者:可可西里 更新时间:2023-11-01 17:40:28 24 4
gpt4 key购买 nike

3.9/2:

For any object (other than a base-class subobject) of trivially copyable type T, whether or not the object holds a valid value of type T, the underlying bytes (1.7) making up the object can be copied into an array of char or unsigned char.

3.9/3:

For any trivially copyable type T, if two pointers to T point to distinct T objects obj1 and obj2, where neither obj1 nor obj2 is a base-class subobject, if the underlying bytes (1.7) making up obj1 are copied into obj2, obj2 shall subsequently hold the same value as obj1.

我正式理解这些规则,但我想知道这些限制的意义何在?

最佳答案

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

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

sizeof(A) == sizeof(B) 完全有可能。如果它们相等,很明显,如果您简单地使用 memcpy 复制 A 子对象,事情就会中断:您将无法阻止读取甚至覆盖c 值。

您的实现可能会也可能不会像那样重复使用填充。设计一个 重复使用填充的 ABI 的一个正当理由恰恰是为了很好地处理那些错误地为此类子对象使用 memcpy 的代码。

评论给出了一个空基类的例子。这是一种特殊情况,当前的实现很可能会重复使用基类的一个字节,但这并不是唯一允许的情况。

关于c++ - 为什么对基类子对象有限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25823791/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com