是否有理由在Linux环境中使用非标准bzero()
和bcopy()
而非memset()
和memcpy()
?我听说很多人说他们对Linux编译器更好,但是没有看到任何优于标准功能的优势。
它们是否比标准产品更优化,或者它们是否具有任何行为特异性?
答案 0 :(得分:49)
虽然bzero
和bcopy
函数不是ISO C(我假设您在将它们称为非标准时所讨论的实际标准),但它们是 POSIX标准的东西,虽然他们预先标记了ISO 和 POSIX。
请注意使用“是”这个词 - 这些功能在POSIX.1-2001中已弃用,并且在POSIX.1-2008中已被删除 ,与memset
相符, memcpy
和memmove
。所以你最好尽可能使用标准的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))
答案 1 :(得分:3)
#include <strings.h>
void bcopy(const void *src, void *dest, size_t n);
<强>描述强>
bcopy()
函数将src中的n个字节复制到dest。即使两个区域重叠,结果也是正确的。
符合: 4.3BSD,似乎 b 来自BSD,它似乎已被弃用。
这意味着bcopy
类似于memmove()
而不是memcpy()
,因为R ..在他的评论中说。
注意:strings.h
也与string.h
不同。
答案 2 :(得分:2)
实际上现在它可能是相反的方式。您会看到,因为memcpy
和memset
包含在标准中,所以允许编译器假定所调用的函数完全符合标准规定的内容。这意味着编译器可以用最有效的方式替换它们来执行它可以解决的操作。另一方面,bcopy
和bzero
标准没有规定任何行为,因此编译器不能假设任何东西 - 这意味着编译器需要发出实际的函数调用。
然而,例如GCC知道bcopy
和bzero
是否为具有它们的操作系统构建。