有什么理由在Linux环境中使用非标准的bzero()
和bcopy()
而不是memset()
和memcpy()
? 我听到很多人说他们对Linux编译器更好,但是没有看到比标准函数更好的优势。
他们是比标准更优化,还是他们有什么行为的特殊性,他们是首选?
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))
#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。
事实上,现在可能是相反的。 你可以看到,因为memcpy
和memset
被包含在标准中,所以编译器将被允许假设被调用的函数完全符合标准规定的内容。 这意味着编译器可以用最有效的方式来代替它们。 另一方面,使用bcopy
和bzero
时,标准并不规定任何行为,因此编译器不能采取任何措施 – 这意味着编译器需要发出实际的函数调用。
然而,GCC例如知道bcopy
和bzero
如果它是为具有它们的操作系统构建的。