首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >memmove不会移动

memmove不会移动
EN

Stack Overflow用户
提问于 2010-12-19 04:50:55
回答 7查看 1.7K关注 0票数 4

memmove不会真正移动内存,对吧?它只是将内存从一个区域复制到另一个区域,并允许这两个区域重叠。我之所以问这个问题,是因为我只想知道为什么这个fnc的调用方式非常具有误导性。

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-12-19 04:56:02

你说得对,它复制了它。但是,memmovememcpy之间存在差异,因为memmove可以正确处理缓冲区重叠的情况,因此建议在这些情况下使用它。

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

票数 9
EN

Stack Overflow用户

发布于 2010-12-19 04:59:38

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

如果您知道src和dst不能是别名,那么使用memcpy()是安全的。如果您不知道哪种方法适用于您,请使用memmove()

票数 6
EN

Stack Overflow用户

发布于 2010-12-19 05:53:23

该函数之所以这样命名,是因为如果被复制的内存区域发生重叠,则它不再是一个副本,因为原始缓冲区不再保持不变。因此,应将原始缓冲区视为不可用。由于您使用的是memmove而不是memcpy,因此很可能会出现这种情况。因此,命名是有意义的:从语义上讲,您是在移动数据,而不是复制数据。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4480098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档