C++ memmove没有';别动

C++ memmove没有';别动,c++,c,memory,libc,C++,C,Memory,Libc,memmove并不能真正移动内存,对吗?它只是将内存从一个区域复制到另一个区域,并允许这两个区域重叠。我问这个问题是因为我只想知道为什么这个fnc被称为非常误导的方式。 因为我知道当某物从一个地方移动到另一个地方时,“thingy”是在另一个地方的这个操作之后,而不是在第一个地方。而对于memmove,它不是这样工作的。我说得对吗?是的,memmove确实是memcpy具有处理重叠块的能力。假设您有一个数组,并且希望在开始时插入一些新项(或删除一些项),那么您所做的就是前后“移动”(现有的或剩余

memmove并不能真正移动内存,对吗?它只是将内存从一个区域复制到另一个区域,并允许这两个区域重叠。我问这个问题是因为我只想知道为什么这个fnc被称为非常误导的方式。

因为我知道当某物从一个地方移动到另一个地方时,“thingy”是在另一个地方的这个操作之后,而不是在第一个地方。而对于memmove,它不是这样工作的。我说得对吗?

是的,
memmove
确实是
memcpy
具有处理重叠块的能力。假设您有一个数组,并且希望在开始时插入一些新项(或删除一些项),那么您所做的就是前后“移动”(现有的或剩余的)项-我想,在这种情况下,名称是有意义的。

是的,
memmove
是副本的另一个变体。它不会“移动”内存,因为原始字节不再是操作之前的字节。它专门用于处理重叠内存的情况

如何做到这一点取决于您的体系结构,但我看到它有两种不同的方式:

  • 使用带有两个memcpy类型操作的临时缓冲区;或
  • 根据重叠类型(如果有),从第一个字节向前复制或从最后一个字节向后复制

将数据从源复制到目标。与之不同的是,它保证在重叠的内存区域上工作。

没错,它会复制它。但是,
memmove
memcpy
之间存在差异,因为
memmove
可以正确处理缓冲区重叠的情况,因此建议在这些情况下使用


但是,由于
memmove
执行额外的检查,当缓冲区较小且肯定不会重叠时,
memcpy
更好

memcpy()和
memmove()
之间的区别在于
memmove()
始终可以安全使用,而不管源和目标之间是否存在别名。这就好像
memmove()
先将数据复制到临时缓冲区,然后再复制到目标
memcpy()
不提供任何别名保证。它可能会按预期工作,但可能不会。如果您知道缓冲区不能重叠,
memcpy()
可以,并且可以在任何给定的库中使用优化,使其比
memmove()
更快。在另一个库中,
memcpy()
实际上可能只是
memmove()


如果您知道src和dst不能是别名,那么可以安全地使用
memcpy()
。如果您不知道哪一个适用于您,请使用
memmove()

此函数的命名是因为如果要复制的内存区域发生重叠,则它不再是副本,因为原始缓冲区不再不变。因此,应认为原始缓冲区不可用。因为您使用的是memmove而不是memcpy,所以很可能就是这种情况。因此,命名是有意义的:从语义上讲,您是在移动数据,而不是复制数据。

要回答您关于
memmove()
名称的问题,我认为该名称旨在反映对将数组中的元素范围移动到数组中另一个范围的支持(例如,在数组的起点或内部为新元素腾出空间)

正如其他答案所提到的,
memcpy()
可以使用
memmove()
无法使用的优化技术,因为
memcpy()
不支持重叠的内存区域,而
memmove()
支持重叠的内存区域

一个你可能要考虑的问题是仍然使用<代码> MeMyVE()/Cube >而不是默认地使用<代码> MycPy.()/Cube >,除非你在一个拷贝性能非常关键的应用程序上工作。<代码> MycPy.()/Cuth>可以提供更好的性能(主要是因为它可以更有效地内联,我想),但在讨论应用程序错误使用C库的

memcpy()
时,请记住:

在内核中,我们使用的优化x86 memcpy实际上是一个memmove(),因为虽然性能非常重要,但重复性和避免意外也非常重要(严格来说,我们有两个版本:一个是“rep-movs”版本,用于速度快的情况,另一个是开放编码的拷贝版本。“rep-movs”版本仅向前,不处理重叠区域)

+1--将第二段中的“it”编辑为
memmove
,因为它看起来像是“it”应用于
memcpy
,这是向后的;)