本文共 1838 字,大约阅读时间需要 6 分钟。
memcpy
与memmove
的目的都是将N
个字节的源内存地址的内容拷贝到目标内存地址中。
但当源内存和目标内存存在重叠时,memcpy
不保证拷贝结果的正确,而memmove
能正确地实施拷贝,但这也增加了一点点开销。
memcpy
的实现:
memmove
的实现:
当拷贝的区域重叠时,若源内存的首地址大于目标内存的首地址,则使用memcpy
与memmove
拷贝重叠的区域都不会出现问题,内容均可以正确的被拷贝;若源内存的首地址小于目标内存的首地址,则使用memcpy
时,源内存中末尾字节内容会被覆盖,导致最后拷贝到目标内存的是已经被覆盖的内容。
551 #ifndef __HAVE_ARCH_MEMCPY552 /**553 * memcpy - Copy one area of memory to another554 * @dest: Where to copy to555 * @src: Where to copy from556 * @count: The size of the area.557 *558 * You should not use this function to access IO space, use memcpy_toio()559 * or memcpy_fromio() instead.560 */561 void *memcpy(void *dest, const void *src, size_t count)562 {563 char *tmp = dest;564 const char *s = src;565566 while (count--)567 *tmp++ = *s++;568 return dest;569 }570 EXPORT_SYMBOL(memcpy);571 #endif572573 #ifndef __HAVE_ARCH_MEMMOVE574 /**575 * memmove - Copy one area of memory to another576 * @dest: Where to copy to577 * @src: Where to copy from578 * @count: The size of the area.579 *580 * Unlike memcpy(), memmove() copes with overlapping areas.581 */582 void *memmove(void *dest, const void *src, size_t count)583 {584 char *tmp;585 const char *s;586587 if (dest <= src) {588 tmp = dest;589 s = src;590 while (count--)591 *tmp++ = *s++;592 } else {593 tmp = dest;594 tmp += count;595 s = src;596 s += count;597 while (count--)598 *--tmp = *--s;599 }600 return dest;601 }602 EXPORT_SYMBOL(memmove);603 #endif
参考链接