Q有什么区别memcpy和memmove?
A memmove如果源和目标参数指向的内存区域重叠,则提供有保证的行为。memcpy不作此保证,因此可以更有效地实现。如有疑问,使用更安全memmove.
这似乎很容易实现memmove;重叠保证似乎只需要一个额外的测试
void *memmove(void *dest, void const *src, size_t n) { register char *dp = dest; register char const *sp = src; if(dp < sp) { while(n-- > 0) *dp++ = *sp++; } else { dp += n; sp += n; while(n-- > 0) *--dp = *--sp; } return dest; }这段代码的问题在于这个额外的测试:比较(dp < sp)不太可移植(它比较两个不一定指向同一对象的指针),并且可能不如它看起来那么便宜。在某些机器上(尤其是分段架构),它可能会很棘手,并且实现起来效率会低得多 [脚注]。
参考文献:K&R2 Sec. B3 p. 250
ISO Sec. 7.11.2.1, Sec. 7.11.2.2
Rationale Sec. 4.11.2
H&S Sec. 14.3 pp. 341-2
PCS Sec. 11 pp. 165-6