2012-02-22 19 views
5

Tengo un objeto que se necesita a través del juego en cada 10 segundos. ¿Seguiré eliminando el objeto o seguiré usando el mismo objeto? ¿dónde se encuentra el objeto en el llamado "tiempo libre"?lo que es más caro para la memoria. "crear y eliminar objetos" o "reutilizar un objeto"?

ya que es un juego para dispositivos móviles, la memoria es una preocupación. , solo quería saber qué método sería fructífero.

"creating and deleting objects" ? 

o

"reusing a object" ? 

gracias

+1

reutilizando un objeto o memoria? ¿Qué quieres decir con los dos? – Arunmu

+1

depende. depende de sus requisitos, depende de su elección de asignador, depende del objeto, depende de los patrones de uso.intente aclarar sus requisitos y luego ** measure ** –

Respuesta

3

Esto depende en gran medida de la naturaleza del objeto y el uso de memoria del resto del programa, pero como regla general:

Si necesita el objeto durante todo el programa, guárdelo en la memoria. Si es pequeño, no importará. Si es grande, volver a crearlo cada diez segundos supondrá una carga para el procesador y las asignaciones también pueden contribuir al memory fragmentation.

Si opta por mantener el objeto vivo como lo recomendé, entonces, mientras no se use, vivirá en la RAM y ocupará espacio allí (suponiendo que su plataforma móvil no tenga memoria de intercambio).

1

Reutilizar el objeto es más económico, especialmente si las operaciones de creación y eliminación son caras (dibujo, acceso al disco, descarga), pero tener demasiados objetos reutilizables en la memoria caché puede llenar la memoria.

0

Cuando un objeto ya no se utiliza, se llama al destructor para liberar la memoria. Pero si luego crea un nuevo objeto del mismo tipo, se llama al constructor para asignar nueva memoria. Sin duda, esto reduce el rendimiento (en la práctica, sin embargo, también depende de qué tan grande sea el objeto), por lo que si ya no necesita un objeto durante la ejecución del programa, debe reutilizarlo cambiando su contenido.

+0

"se llama al constructor para asignar nueva memoria", en realidad no. El constructor puede asignar memoria, puede que no. –

+1

@SteveJessop: el constructor se usa generalmente para asignar nueva memoria. Además, el constructor predeterminado _llama los constructores por defecto de todos los miembros que los tienen. Si hay un miembro con algunos constructores, pero sin uno predeterminado, entonces es un error en tiempo de compilación_ (ver [aquí] (http://stackoverflow.com/questions/4837223/c-default-destructor)). – enzom83

+0

Mi punto es que la asignación de memoria es independiente de la construcción. Los constructores solo asignan memoria si tienen una línea (o una línea en una clase base o un constructor miembro) que asigna memoria, con 'new' o' malloc' o lo que sea. –

1

¿Qué dice tu profiler?

Depende en gran medida del objeto, el compilador y los tipos de uso que están haciendo de él. La única vez que lo comparaté (y std::string en la biblioteca g++, siendo reiniciado cada vez a través de un bucle), reconstruyendo el objeto cada vez en el bucle era más rápido. En el , la mayoría de los otros contenedores estándar conservan su memoria incluso cuando se vacía; en tales casos, si define el contenedor fuera del bucle , (normalmente) llegará a su tamaño final bastante rápido, después de , donde no habrá otras asignaciones.

Y por supuesto, debe considerar cuán difícil es restaurar el objeto a un estado prístino. Es casi imposible para los objetos derivados de std::ios_base, por ejemplo; casi siempre quiere usar un nuevo std::ostringstream, en lugar de intentar reutilizar uno existente. A pesar del costo.

+0

Hacer las pruebas de memoria en un bucle simple es injusto. La razón es porque simplemente seguirá creando y destruyendo objetos en el mismo orden, por lo tanto, el bloque en la memoria puede reutilizarse continuamente (es decir, el administrador de memoria no tiene ningún trabajo real que hacer). –

+0

@ edA-qamort-ora-y Quizás. Pero ese era el problema en ese momento: era más rápido reutilizar un 'std :: string' declarado encima del bucle, o recrear uno cada vez a través del bucle, asignándole un nuevo valor. Y estoy bastante seguro de que los resultados son un artefacto de la implementación de g ++ de 'std :: string': como con todas las mediciones, no hay absolutamente ninguna garantía de que termine con resultados similares con un compilador diferente y una biblioteca diferente . Mi punto era que no se puede decir sin medir. –

+0

Solo agrego que es difícil medir correctamente, y los bucles aislados simples generalmente no son pruebas justas. –

Cuestiones relacionadas