> 技术文档 > c++中memcpy实现增强版

c++中memcpy实现增强版

你的代码已经非常接近 memmove 的功能了,虽然你写的是 memcpy。下面是对这段代码的专业点评与优化建议,可作为面试中的“进阶答题模板”。


✅ 功能亮点:

  • ✅ 处理了空指针,避免空引用错误。
  • ✅ 支持地址重叠的安全复制(从后往前拷贝),这是 memmove 的核心特性。
  • ✅ 使用 char* 强转,符合逐字节操作的预期。
  • ✅ 逻辑清晰,易于维护和理解。

⚠️ 标准行为说明:

你实现的是一个增强版memcpy,更接近 memmove 的行为:

函数 是否支持重叠区域 备注 memcpy ❌ 不支持 行为未定义 memmove ✅ 支持 自动调整拷贝方向

所以,如果你在面试中用它回答 memcpy 的实现,建议说明:

这是一个“增强版 memcpy”,在遇到重叠地址时采用了 memmove 的安全策略,从而避免未定义行为。


✅ 改进建议(面试加分项):

1. 将重叠处理拆分为 memmove,保留标准 memcpy

// 正统 memcpy(不处理重叠)void* my_memcpy(void* dest, const void* src, size_t count) { if (!dest || !src) return dest; auto* d = static_cast<char*>(dest); const auto* s = static_cast<const char*>(src); for (size_t i = 0; i < count; ++i) { d[i] = s[i]; } return dest;}// 真正的 memmove 实现(带重叠处理)void* my_memmove(void* dest, const void* src, size_t count) { if (!dest || !src) return dest; auto* d = static_cast<char*>(dest); const auto* s = static_cast<const char*>(src); if (d > s && d < s + count) { for (size_t i = count; i != 0; --i) { d[i - 1] = s[i - 1]; } } else { for (size_t i = 0; i < count; ++i) { d[i] = s[i]; } } return dest;}

这样可以明确语义,符合 libc 的设计理念。


✅ 面试答题模板(你可以背诵的总结):

我实现了一个增强版 memcpy,它支持对内存区域进行安全复制,包括当目标地址和源地址发生重叠的情况。在实现中我判断了是否存在重叠,并根据位置选择正序或反序复制,类似于标准库中的 memmove。如果面试中严格要求实现 memcpy 行为,我也可以提供一个不考虑重叠、更接近标准定义的版本。


如果你有更高需求(比如内存对齐、SIMD 优化、编译器 intrinsic 支持等),我也可以继续帮你升级版本。需要吗?