C++ memcpy不适用内存重叠的问题

前言

在走查代码时发现大佬曾对memcpy深恶痛绝,因为memcpy引发了一系列的错误,我查了一下发现是一个所谓的“内存重叠”问题,便讨论思考了一下。

背景

在《C语言内存重叠详解》一文中,对内存重叠进行了解释说明,举例便是memcpy,其中举了向前拷贝和向后拷贝时的可能出现内存重叠的场景,并解释了内存重叠带来的一些问题:

【C语言】内存重叠详解

但我们使用的场景是(将绿色拷贝到蓝色)

内存重叠

当memcpy是正序拷贝的话,则理论上即便出现内存重叠,也不影响拷贝结果。但实际上确实出现了拷贝结果异常的情景。

说明

我查到了对memcpy的源码释义一文: 经过查阅源码,我们发现,当memcpy在处理较小数据的时候,是按字节拷贝的。当memcpy在处理较大数据的时候,会将数据对齐的部分按页拷贝,对非对其的部分按字节拷贝。这样就出现了问题:如果重叠的部分刚好是一页,那拷贝就无法保证正常了。

总结

如果确定memcpy可能存在内存重叠的风险,则建议使用memmove来代替,效率可能低一点,但更安全。