C++-memcpy与memmove

memcpy与memmove的区别

两者都是进行内存拷贝,前者不进行内存重叠检测,后者则要进行内存重叠检测。

重叠情况

  1. src与dst区域完全不重叠,不会出现问题。
  2. 有重叠且dst在src前面,不会出现问题。
  3. 有重叠且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;
}