mem中的C实现

有人可以帮助我理解如何在C中实现memmove。我只有一个特殊条件吗?

if((src dst)) copy from the back 

它还取决于堆栈的增长方式吗?

在数学上,你不必担心它们是否重叠。 如果src小于dst ,只需从末尾复制。 如果src大于dst ,只需从头开始复制。

如果srcdst相等,则直接退出。

那是因为您的案例是以下之一:

 1) <-----s-----> start at end of s <-----d-----> 2) <-----s-----> start at end of s <-----d-----> 3) <-----s-----> no action <-----d-----> 4) <-----s-----> start at beginning of s <-----d-----> 5) <-----s-----> start at beginning of s <-----d-----> 

即使没有重叠,这仍然可以正常工作,并简化您的条件。

如果您有一种更有效的方式来复制前进而不是后退,那么,是的,您应该检查重叠以确保您使用更有效的方法(如果可能)。 换句话说,更改上面的选项1以从头开始复制。

如果两个内存区域不重叠,则memmove可以转换为memcpy。 memcpy显然在大多数系统上都得到了极大的优化(我使用的其中一个系统几乎使用了本书中的每一个技巧,从展开的循环到支持最大吞吐量的SSE操作)。

如果两个内存区域确实重叠,则出于所有意图和目的,将要复制的区域移动到临时缓冲区中,并将临时缓冲区(最有可能是memcpy)复制回原始缓冲区之上。 你不能从一开始就工作,或者从一个重叠的区域开始工作,因为你总是会在这个过程中至少有一些数据被破坏。

话虽如此,自从我查看libc代码已经有很长一段时间了,所以我可能还没有想到memmove和重叠区域的优化。

memmove根本不依赖于堆栈的增长方式 – 它只是将一个内存区域复制到另一个位置 – 与memcpy完全相同,只是它处理重叠区域而memcpy则不然。

编辑:实际上,再思考一下……如果你从正确的“源头”(可以这么说)出发,可以从后面工作,这取决于移动本身(例如,源是

取决于编译器。 好的编译器将使用依赖于目标处理器指令集和总线宽度的良好优化。