Pregunta

Me gusta mucho STL. Hace que los algoritmos de codificación sean muy convenientes, ya que le proporciona todas las primitivas como parición, búsqueda, búsqueda_binaria, iteradores, prioridad_queue, etc. Además, no tiene que preocuparse por las pérdidas de memoria.

Mi única preocupación es la penalización de rendimiento de la sobrecarga del operador que es necesaria para que STL funcione. A modo de comparación, creo que se basa en que == proporciona la semántica necesaria. Necesitamos sobrecargar el operador == si estamos agregando nuestras clases a un contenedor.

¿Cuánta eficiencia estoy perdiendo por esta conveniencia?

Otra pregunta aparte sobre las pérdidas de memoria:

  1. ¿Puede ocurrir alguna pérdida de memoria cuando se usan contenedores STL?
  2. ¿Puede suceder una pérdida de memoria en Java?
¿Fue útil?

Solución

Al usar algoritmos stl en tipos genéricos, debe proporcionar la lógica de comparación de alguna manera. La sobrecarga del operador no tiene penalización de rendimiento sobre ninguna otra función y puede (como cualquier otra función) estar en línea para eliminar cualquier sobrecarga de llamadas a funciones.

Muchos contenedores y algoritmos estándar también usan std::less y, por lo tanto, de manera predeterminada < en lugar de ==.

Los contenedores estándar no tienen fugas, pero puede usarlos para contener objetos (como punteros) que no necesariamente limpian la memoria que 'poseen'.

Es difícil perder memoria en Java, pero eso no significa que no pueda meterse en problemas al no tener una buena semántica de propiedad de objetos y no significa que no pueda usar toda la memoria disponible y accidente.

Otros consejos

Dejaré las respuestas de C ++ a los carteles anteriores, pero 100% sí, puede perder memoria en Java. Tiende a ser realmente difícil de encontrar también a menos que tenga algunas buenas herramientas de creación de perfiles de memoria. En general, las pérdidas de memoria en los lenguajes de recolección de basura automatizados (por ejemplo, Java, Python, etc.) ocurren cuando se crean instancias repetidas de objetos, pero A. no los limpia cuando termina con ellos (por ejemplo, llamando a & Quot ; cierre " en una conexión de base de datos) o B. continúe persistiendo otros objetos que los señalen (por ejemplo, Hashtables) para que el recolector de basura automático nunca pueda recolectarlos.

Si su aplicación está en lo que cree que debería ser un estado estable y obtiene uno de estos:

http://java.sun.com /javase/6/docs/api/java/lang/OutOfMemoryError.html

Tendrás una divertida depuración;)

Dado que la sobrecarga del operador simplemente da como resultado una llamada de función, y de todos modos tendría que escribir una función para hacer el trabajo, la sobrecarga es cero. La sobrecarga del operador es solo una conveniencia para que pueda hacer cosas como x == y en lugar de x.equals (y) o x & Lt; y en lugar de x.compaterTo (y). El compilador esencialmente genera algo como: x. == (y) o x. & Lt; (y) (que no se compilará, pero se entiende la idea).

La " penalización " En realidad es una bonificación.

Tomemos el algoritmo más típico, la clasificación. C no tiene sobrecarga del operador. Como resultado, qsort toma un puntero de función. Cada comparación usa una llamada de función indirecta (en tiempo de ejecución). C ++ tiene sobrecarga del operador. Para std::sort, cada comparación es una llamada directa (fijada por el vinculador) o en línea (por compilador). Esto es mucho más efectivo. No es raro que <=> sea 6 veces más rápido que <=>.

En general, la sobrecarga del operador hace que sea mucho más fácil expresar " default " funciona para un tipo, de manera que pueda ser explotado por otro código y compiladores. Las alternativas son mucho menos eficientes. O confían en macros (que perjudican a los programadores) o confían en punteros de función (que perjudican a los optimizadores y CPU).

  

Mi única preocupación es la penalización de rendimiento de la sobrecarga del operador que es necesaria para que STL funcione. A modo de comparación, creo que se basa en que == proporciona la semántica necesaria. Necesitamos sobrecargar el operador == si estamos agregando nuestras clases a un contenedor.

Es inexistente. Su operador sobrecargado se implementa como una llamada de función. Y si no sobrecargó el operador, necesitaría definir una función para usar en su lugar. Por lo tanto, el rendimiento es exactamente igual, solo que con una sintaxis más limpia.

¿Cuál es la penalización de rendimiento del operador sobrecarga de STL

Además de esto, siempre puede tener a sus operadores en línea, esto ni siquiera tendrá la penalidad de una llamada de función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top