我认为将内存设置为零的一个优势bzero()
是memset()
减少了出错的机会。
我不止一次遇到了一个看起来像这样的错误:
memset(someobject, size_of_object, 0); // clear object
编译器不会抱怨(尽管在某些编译器上可能会提高一些警告级别)并且效果将是内存没有被清除。因为这不会破坏对象 - 它只是让它不理会 - 这个错误很可能不会表现出任何明显的东西。
不标准的事实bzero()
是一个小刺激。(FWIW,如果我的程序中的大多数函数调用都是非标准的,我不会感到惊讶;事实上,编写这样的函数是我的工作)。
在对此处另一个答案的评论中,Aaron Newton 引用了 Unix Network Programming, Volume 1, 3rd Edition by Stevens 等人的以下内容,第 1.2 节(强调添加):
bzero
不是 ANSI C 函数。它源自早期的伯克利网络代码。尽管如此,我们在整个文本中都使用它,而不是 ANSI Cmemset
函数,因为(只有两个参数)比(三个参数)bzero
更容易记住。memset
几乎每个支持套接字 API 的供应商也提供了bzero
,如果没有,我们会在我们的unp.h
标头中提供一个宏定义。
事实上,TCPv3 [TCP/IP Illustrated, Volume 3 - Stevens 1996] 的作者犯了一个错误,即memset
在第一次印刷时将第二个和第三个参数交换为 10 次。AC 编译器无法捕获此错误,因为两个参数属于同一类型。(实际上,第二个参数是 anint
而第三个参数是size_t
,通常是 an unsigned int
,但指定的值,分别为 0 和 16,对于其他类型的参数仍然是可接受的。)调用memset
仍然有效,因为只有 a实际上,很少有套接字函数需要将 Internet 套接字地址结构的最后 8 个字节设置为 0。不过,这是一个错误,可以通过使用
bzero
bzero
,因为如果使用函数原型,C 编译器总是会捕捉到交换两个参数。
我也相信绝大多数调用memset()
都是零内存,那么为什么不使用针对该用例量身定制的 API 呢?
一个可能的缺点bzero()
是编译器可能更有可能进行优化memcpy()
,因为它是标准的,因此它们可能被编写为识别它。但是,请记住,正确的代码仍然比经过优化的错误代码更好。在大多数情况下, usingbzero()
不会对程序的性能造成明显影响,这bzero()
可以是扩展为memcpy()
.