**memcpy()**函数,网上的理解可谓是众说纷纭,足见其博大精深。在下以初学者的身份一探究竟。
-
关于memcpy()源码,鄙人解析说下:
void *memcpy(void *dst, void *src, size_t len) { if (dst == NULL || src == NULL || n <= 0) { return NULL; } char *d = (char *)dst; const char *s = (char *)src; //没有内存重叠,从低地址开始复制 if (d <= s || d >= s + len){ while (len -- ) { *d++ = *s++; } else { //有内存重叠,从高地址开始复制 s = s + len - 1; d = d + len - 1; while (len --) { *d-- = * s--; } retuen dst; } } }
相比于以下写法(简化暂不考虑重合情况):
void *memcpy(void *dst, void *src, size_t len) { char *d = (char *)dst; char *s = (char *)src; int i; for (i = 0; i < len; i++) d[i] = s [i]; return dst; }
-
比较
两种方法都是按照byte拷贝。但是第一种写法效率自然是要快&#x