¿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
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.
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.
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.
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.
@JaredPar: Eso recorre la memoria comenzando en 'pStr' dos veces. – jason
@ Jason sí lo hace. Solo quería demostrar la similitud entre las funciones implementando una en términos de la otra – JaredPar
@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
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()
.
- 1. C: Diferencias entre strchr() y el índice()
- 2. ¿Hay diferencias entre "y"
- 3. Diferencias entre OTL y SOCI
- 4. Diferencias entre JPA y JPA2
- 5. diferencias entre scipy.sparse.linalg.lsmr y scipy.sparse.linalg.lsqr
- 6. Diferencias entre App.Config y Web.Config?
- 7. Diferencias entre `input` y` raw_input`
- 8. Diferencias entre Sproutcore y Ember
- 9. Diferencias entre Excepción y Error
- 10. Diferencias entre Proc y Lambda
- 11. Diferencias entre NoClassDefFoundError y ClassNotFoundException?
- 12. ¿Diferencias entre Smalltalk y python?
- 13. Diferencias entre Ant y Maven
- 14. Diferencias entre DB2 y Oracle
- 15. Diferencias entre utf8 y latin1
- 16. Diferencias entre textMultiLine y textLongMessage
- 17. Diferencias entre Narwhal y Node.js?
- 18. Diferencias entre SwingWorker y Executor
- 19. Diferencias entre Camel y BPEL
- 20. Diferencias entre AForge y OpenCV
- 21. Diferencias entre funtores y endofunctors
- 22. Diferencias entre Perl y PHP
- 23. Diferencias entre .ContextMenu y .ContextMenuStrip
- 24. Diferencias entre Java y C# y .NET
- 25. Oracle Diferencias entre NVL y Coalesce
- 26. Diferencias entre ExpandoObject, DynamicObject y dynamic
- 27. Diferencias entre Javascript regexp literal y constructor
- 28. diferencias entre Msxml2.ServerXMLHTTP y WinHttp.WinHttpRequest?
- 29. Diferencias entre ItemizedOverlay y Overlay class
- 30. Diferencias entre LAM MPI y OpenMPI
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 *. –