memmove不动

The*_* do 3 c c++ memory libc

memmove并没有真正移动内存不对吗?它只是将内存从一个区域复制到另一个区域,并允许这两个区域重叠.我问这个问题是因为我只是想知道为什么这个fnc以非常误导的方式被调用.
因为我明白当某个东西从一个地方移动到另一个地方时,"东西"就是在另一个地方而不是第一个地方之后.而memmove它不会那样工作.我对吗?

rus*_*lik 9

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

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


Sin*_*ion 6

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

如果你知道src和dst不能是别名,那么它是安全的memcpy().如果您不知道哪一个适用于您,请使用memmove().


Ytt*_*ill 5

该函数是这样命名的,因为如果被复制的内存区域确实发生重叠,则它不再是副本,因为原始缓冲区不再是未更改的.因此,原始缓冲区应被视为不可用.由于您使用的是memmove而不是memcpy,因此可能就是这种情况.因此,命名是有意义的:从语义上讲,您正在移动数据而不是复制数据.