38

Is there any reason to use the non-standard bzero() and bcopy() instead of memset() and memcpy() in a Linux environment? I've heard many say that they're better for Linux compilers, but haven't seen any advantages over the standard functions.

Are they more optimized than the standard ones, or do they have any behavioral particularity for which they're preferred?

4

3 回答 3

56

虽然bzerobcopy函数不是 ISO C(我假设您在将它们称为非标准时所说的实际标准),但它们POSIX 标准的东西,尽管它们早于 ISOPOSIX。

并注意使用“是”这个词 - 这些函数在 POSIX.1-2001 中已弃用,并在 POSIX.1-2008中最终删除memset,以尊重memcpymemmove. 所以你最好尽可能使用标准的 C 函数。

如果您有很多使用它们的代码,并且您不想全部更改(尽管您可能在某些时候应该这样做),您可以使用以下快速替换:

// void bzero(void *s, size_t n);
#define bzero(s, n) memset((s), 0, (n))

// void bcopy(const void *s1, void *s2, size_t n);
#define bcopy(s1, s2, n) memmove((s2), (s1), (n))
于 2013-08-20T08:47:15.907 回答
3
#include <strings.h>
void bcopy(const void *src, void *dest, size_t n);

说明bcopy()函数将 n 个字节从 src 复制到 dest。结果是正确的,即使两个区域重叠。

符合:4.3BSD,似乎b来自 BSD,似乎已被弃用。

这意味着bcopy类似于R.. 在他的评论中所说的。memmove()memcpy()

注意:strings.h也不同于string.h.

于 2016-09-19T09:16:11.257 回答
2

事实上,现在情况可能正好相反。您会看到,因为memcpyandmemset包含在标准中,所以编译器将被允许假定调用的函数完全符合标准的规定。这意味着编译器可以用最有效的方式替换它们来执行它可以计算的操作。另一方面,标准并没有规定任何行为,因此编译器不能假设任何事情 - 这意味着编译器需要发出实际的函数bcopy调用。bzero

bcopy然而,例如 GCC 知道bzero它是否是为拥有它们的操作系统构建的。

于 2016-02-19T08:24:46.087 回答