这两者通常的主要区别在于它们的起源。 bcopy
源自柏克莱软件发行版(BSD)系统,而 memcpy
以及相关函数主要来自AT&T的System V。最后,为了遵循传统代码,这些函数都被包含在标准中。
在Richard Steven的书"UNIX network programming"中有一个关于使用 memset
和 bzero
的良好解释,可以在一定程度上解释使用哪一个。
今天的实现只需调用相同的内部实现,但提供这两种接口。
bcopy
和 memmove
做的事情完全相同。但是,它们接受参数的顺序不同:bcopy(src, dest, n)
与 memmove(dest, src, n)
。因此,它们不能成为同一个函数的两个名称。bcopy
是这两个中较旧的一个;如果记忆没有出错,它在3BSD中存在。 而memmove
则是由C委员会在1988年左右发明的。memmove
,因为它是C标准所要求的,因此比bcopy
更具可移植性。从功能上来说,它们是等同的。区别在于可移植性。memmove
是C标准的一部分,而bcopy
是POSIX的一部分,因此可移植性较差。
bcopy
已经被弃用。手册上写道:
该函数已被弃用(在POSIX.1-2001中标记为LEGACY):在新程序中使用
memcpy(3)
或memmove(3)
。请注意,memcpy(3)
和memmove(3)
的前两个参数互换。POSIX.1-2008删除了对bcopy()
的规范。
memove
和memcpy
是 C 标准库的一部分,但bcopy
是 POSIX 特定的函数,因此在非 POSIX 平台(如 Windows)上不可用。 - Daibcopy
,bzero
等函数。然而,这些函数已经过时,如今应该使用mem...()
函数。 - David C. Rankin