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 支持等),我也可以继续帮你升级版本。需要吗?