memcpy与memmove的区别
两者都是进行内存拷贝,前者不进行内存重叠检测,后者则要进行内存重叠检测。
重叠情况
- src与dst区域完全不重叠,不会出现问题。
- 有重叠且dst在src前面,不会出现问题。
- 有重叠且src在dst前面,有可能出现问题。
memcpy
函数原型
1
| void* memcpy(void* dst, const void* src, size_t n);
|
实现
1 2 3 4 5 6 7 8 9
| void* memcpy(void* dst, const void* src, size_t n) { assert(dst != nullptr && src != nullptr); char* dst_ = (char*)dst; char* src_ = (char*)src; while (n--) { *dst_++ = *src_++; } return dst; }
|
memmove
函数原型
1
| void* memmove(void* dst, void* src, size_t n);
|
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| void* memmove(void* dst, void* src, size_t n) { assert(dst != nullptr && src != nullptr); char* n_dst = (char*)dst; char* n_src = (char*)src; if (n_dst > n_src && n_src + n > n_dst) { n_dst += n - 1; n_src += n - 1; while (n--) { *n_dst-- = *n_src--; } }else { while (n--) { *n_dst++ = *n_src++; } } return dst; }
|