Comparación de funciones bzero y memset

Comparison Bzero

Función Bzero

Prototipo: void bzero (void * s, int n)



Archivo de encabezado: #include



Función: establece los primeros n bytes de la cadena s en 0. Generalmente, n normalmente toma sizeof (s) para borrar todo el bloque.



Valor de retorno: sin valor de retorno

ejemplo:

Limpiar una matriz a cero:



char str [10]

bzero (str, sizeof (str))

También es posible limpiar una estructura:

|_+_|

Para variables estructurales

prueba del nodo de estructura

Borrarlo con bzero

bzero (& Prueba, tamaño de (Prueba))


Función Memset

Prototipo: void * memset (void * s, int c, size_t n)

Encabezado: #include o #include

Descripción: Reemplace los primeros n bytes en s con cy devuelva s

El efecto es llenar un bloque de memoria dado con un valor dado, que es la forma más rápida de borrar una gran estructura o matriz.

Aquí vemos que c es de tipo int, hay dos puntos a tener en cuenta:

1) Si la dirección apuntada por s es de tipo char, el valor de c puede ser cualquier valor de carácter

2) Si la dirección apuntada por s no es de tipo char, el valor de c solo puede ser -1 o 0.

Dado que -1 y 0 se convierten a binario, cada bit es el mismo. Deje que el tipo int ocupe 4 bytes, luego -1 = 0XFFFFFFFF, 0 = 0X00000000.

ejemplo:

Igual que arriba para borrar str:

memset (cadena, 0, tamaño de (cadena))

Borre la variable de prueba anterior a cero:

memset (& Prueba, 0, tamaño de (Prueba))


Análisis del uso de dos funciones:

He visto en muchos lugares que se recomienda utilizar la función memset en lugar de la función bzero. La razón es que en el estándar POSIX.1-2001, esta función se ha marcado como una función heredada y no se recomienda. Hace unos días estuve en el volumen de programación de la red UNIX. Ver el autor dijo todo el libro Libro Usando la función bzero en lugar de la función memset, el autor explica esto:

Bzero no es una función ANSI C, se originó a partir del código de programación de red de Berkeley temprano. Sin embargo, lo usamos en todo el libro en lugar de la función memset ANSI C, porque bzero (con 2 parámetros) se recuerda mejor que memset (con 3 parámetros).

Y da razones: en la primera impresión del arte TCPv3, el autor cometió un error en el lugar donde aparecía la función memset en 10, e intercambió el segundo y tercer parámetro. El compilador de C no puede encontrar este problema porque los dos parámetros son del mismo tipo (size_t generalmente se define como unsigned int), pero la función bzero no.

Después de leer dos recomendaciones diferentes, mi actitud es la siguiente: las dos funciones que más se usan son para borrar, también suelo usar la función bzero en lugar de la función memset, en comparación con los dos parámetros, la memoria es realmente mejor. El uso de estas dos funciones debe ser Diferente de persona a persona Y elija diferentes funciones para usar en diferentes entornos de código. No había visto el experimento específico antes de ver el problema del uso inadecuado de dos funciones en Internet. No lo discutiré aquí. Después de más investigación, agregue comparaciones de rendimiento.