bzero()&bcopy()与memset()和memcpy()

有什么理由在Linux环境中使用非标准的bzero()bcopy()而不是memset()memcpy() ? 我听到很多人说他们对Linux编译器更好,但是没有看到比标准函数更好的优势。

他们是比标准更优化,还是他们有什么行为的特殊性,他们是首选?

bzerobcopy函数实际上并不是标准(ISO)C,它们是POSIX的东西(根据官方标准 – 实际上它们是在ISO和POSIX之前的)。

并注意,单词“是” – 它们在POSIX.1-2001中被弃用,并在POSIX.1-2008中被移除,因为它们是memsetmemcpymemmove ,所以最好使用标准的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)) 
 #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 ..在他的评论中说。

注意:字符串s .h也不同于string.h。

事实上,现在可能是相反的。 你可以看到,因为memcpymemset被包含在标准中,所以编译器将被允许假设被调用的函数完全符合标准规定的内容。 这意味着编译器可以用最有效的方式来代替它们。 另一方面,使用bcopybzero时,标准并不规定任何行为,因此编译器不能采取任何措施 – 这意味着编译器需要发出实际的函数调用。

然而,GCC例如知道bcopybzero如果它是为具有它们的操作系统构建的。