2010-11-23 17 views
19

¿Cuál es la diferencia real entre memchr() y strchr(), además del parámetro extra? ¿Cuándo usas uno u otro? ¿y habría un mejor rendimiento en el resultado reemplazando strchr() por memchr() si se analiza un archivo grande (teóricamente hablando)?diferencias entre memchr() y strchr()

Respuesta

2

strchr espera que el primer parámetro sea nulo, y por lo tanto no requiere un parámetro de longitud.

memchr funciona de manera similar pero no espera que el bloque de memoria tenga terminación nula, por lo que puede estar buscando un carácter \0 con éxito.

+3

Cualquiera puede buscar un carácter nulo muy bien. El problema es que 'strchr' no puede buscar * más allá de un carácter nulo *. –

12

strchr se detiene cuando golpea un carácter nulo pero memchr no; esta es la razón por la cual el primero no necesita un parámetro de longitud, pero el último sí lo necesita.

1

No hay diferencia real, solo que strchr() asume que está mirando a través de una cadena terminada en nulo (por lo que determina el tamaño).

memchr() simplemente busca el valor dado hasta el tamaño se ha pasado.

8

Funcionalmente no hay diferencia en que ambos exploran una variedad/puntero para un valor proporcionado. La versión memchr solo toma un parámetro adicional porque necesita conocer la longitud del puntero proporcionado. La versión strchr puede evitar esto porque puede usar strlen para calcular la longitud de la cadena.

Las diferencias pueden aparecer si intenta utilizar un char* que almacena datos binarios con strchr ya que potencialmente no verá la longitud completa de la cadena. Esto es cierto de casi cualquier char* con datos binarios y una función str*. Para datos no binarios, aunque son prácticamente la misma función.

En realidad se puede codificar hasta strchr en términos de memchr con bastante facilidad

const char* strchr(const char* pStr, char value) { 
    return (const char*)memchr(pStr, value, strlen(pStr)+1); 
} 

El +1 es necesario aquí porque strchr se puede utilizar para encontrar el terminador nulo en la cadena. Definitivamente no es una implementación óptima porque recorre la memoria dos veces. Pero sirve para demostrar cuán cerca están los dos en funcionalidad.

+1

@JaredPar: Eso recorre la memoria comenzando en 'pStr' dos veces. – jason

+0

@ Jason sí lo hace. Solo quería demostrar la similitud entre las funciones implementando una en términos de la otra – JaredPar

+0

@JaredPar: eso es justo, solo quiero señalarlo explícitamente porque creo que a menudo se pasa por alto (piense en el artículo de Joel on Software sobre la pintor chico). – jason

-2

En términos prácticos, no hay mucha diferencia. Además, las implementaciones son libres de hacer que una función sea más rápida que la otra.

La verdadera diferencia proviene del contexto. Si está tratando con cadenas, use strchr(). Si tiene un búfer de tamaño finito y sin terminación, utilice memchr(). Si desea buscar un subconjunto de tamaño finito de una cadena, utilice memchr().