You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:05:23