prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 11.25

Q有什么区别memcpymemmove?


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


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管