在上一学期的系统编程课上,我们必须用C语言实现一个基本的客户端/服务器。在初始化结构时,比如sock_addr_in
,或者char buffer(我们用来在客户端和服务器之间来回发送数据),教授告诉我们只使用bzero
而不是memset
来初始化它们。他从来没有解释过为什么,我很好奇这是不是有一个合理的原因?
我在这里看到:http://fdiv.net/2009/01/14/memset-vs-bzero-ultimate-showdown,bzero
的效率更高,因为它只会清零内存,所以它不需要像memset
那样做任何额外的检查。尽管如此,这仍然不一定是绝对不使用memset
进行内存清零的理由。
bzero
被认为是被弃用的,而且不是标准的C函数。根据手册,由于这个原因,memset
比bzero
更受欢迎。那么,为什么你还想在memset
上使用bzero
呢?仅仅是为了提高效率,还是其他原因?同样,与bzero
相比,memset
有哪些优点使其成为较新程序事实上的首选选项?
发布于 2013-06-14 05:06:22
比起memset
,我看不出有任何理由更喜欢bzero
。
memset
是一个标准的C函数,而bzero
从来不是一个C标准函数。其基本原理可能是因为您可以使用memset
函数实现完全相同的功能。
现在关于效率,像gcc
这样的编译器为memset
使用内置实现,当检测到常量0
时,它会切换到特定的实现。当内置被禁用时,glibc
也是如此。
发布于 2013-12-23 14:08:09
对于memset函数,第二个参数是int
,第三个参数是size_t
,
void *memset(void *s, int c, size_t n);
这通常是一个unsigned int
,但是如果像0 and 16
这样的第二个和第三个参数的值分别以错误的顺序输入为16和0,那么,这种对memset的调用仍然可以工作,但不会做任何事情。因为要初始化的字节数被指定为0
。
void bzero(void *s, size_t n)
这样的错误可以通过使用bzero来避免,因为如果使用函数原型,则将两个参数交换为bzero将始终被C编译器捕获。
发布于 2019-07-24 01:20:07
memset有3个参数,bzer0有2个内存限制,额外的参数会占用4个字节,大多数情况下,它会被用来将所有内容设置为0
https://stackoverflow.com/questions/17096990
复制相似问题