memcpy处理潜在重叠子对象的合法性探讨及代码验证
memcpy处理潜在重叠子对象的合法性分析
根据C++标准[basic.types#2]条款,memcpy不适用于潜在重叠子对象的特定场景,标准原文翻译如下:
对于任何平凡可复制类型T的对象(潜在重叠子对象除外),无论该对象是否持有T类型的有效值,构成该对象的底层字节([intro.memory])均可复制到char、unsigned char或std::byte([cstddef.syn])数组中。36 若将该数组的内容复制回原对象,则该对象随后应持有其原始值。
针对你提出的代码场景——将Derived对象的Base子对象(属于潜在重叠子对象)通过memcpy复制到独立Base对象中,该操作是合法的,原因如下:
- 条款的限制核心是禁止对潜在重叠子对象进行"字节备份到字符数组再恢复回原对象"的操作,目的是避免这类操作引发未定义行为;
- 你的代码中,源是Derived的Base子对象,目标是完全独立的Base实例,二者内存不重叠,且操作是直接在两个平凡可复制类型对象间进行字节复制:
- Base是平凡可复制类型,其内存表示在子对象和独立实例中完全一致;
- memcpy本身支持对不重叠的平凡可复制类型对象进行字节复制,这一用法不受[basic.types#2]条款的限制。
你的代码示例:
class Base { int i; }; class Derived : public Base { int d; }; void copy_base(const Base &src, Base &dest) { memcpy((void *)&dest, (const void *)&src, sizeof(Base)); } int main() { Derived d; Base copy; copy_base(static_cast<Base&>(d), copy); return 0; }
内容的提问来源于stack exchange,提问作者minex
相关产品推荐
相关产品推荐

