2010-01-31 33 views
8

Duplicar posible:
Any reason to overload global new and delete?¿Cuándo sobrecarga el operador nuevo?

¿En qué casos tiene sentido perfecto para sobrecargar operator new?

Escuché que lo hace en una clase que a menudo se asigna utilizando new. ¿Puede dar un ejemplo?

¿Y hay otros casos en los que desea sobrecargar operator new?

Actualización: Gracias por todas las respuestas hasta el momento. ¿Alguien podría dar un ejemplo de código corto? A eso me refería cuando le pregunté sobre un ejemplo anterior. Algo así como: Aquí hay una clase pequeña de juguetes, y aquí hay un operator new que funciona para esa clase.

+7

No tratando de ser una ducha, pero se han encontrado respuestas útiles con una búsqueda : http://stackoverflow.com/questions/1152511/any-reason-to-overload-global-new-and-delete – Skurmedel

+0

@Skurmedel: Pero ese solo es sobre operador global nuevo (y eliminar). Preguntaba sobre la sobrecarga del operador nuevo en general, p. en una clase. – Frank

+0

No veo por qué las razones serían realmente diferentes, aparte de los diferentes ámbitos. – Skurmedel

Respuesta

3

El mejor caso que encontré fue para evitar la fragmentación del montón al proporcionar varios montones de bloques de tamaño fijo. es decir, crea un montón que consta completamente de bloques de 4 bytes, otro con bloques de 8 bytes, etc.

Esto funciona mejor que el montón predeterminado 'todo en uno' porque puede reutilizar un bloque, sabiendo que su asignación se realizará calce en el primer bloque libre, sin tener que controlar o caminar el montón buscando un espacio libre del tamaño correcto.

La desventaja es que consume más memoria, si tiene un montón de 4 bytes y un montón de 8 bytes, y quiere asignar 6 bytes ... tendrá que ponerlo en el 8- montón de bytes, desperdiciando 2 bytes. Hoy en día, esto no es un problema (especialmente cuando se considera la sobrecarga de esquemas alternativos)

Puede optimizar esto, si tiene muchas asignaciones para hacer, puede crear un montón de ese tamaño exacto. Personalmente, creo que desperdiciar unos pocos bytes no es un problema (por ejemplo, está asignando una gran cantidad de 7 bytes, usar un montón de 8 bytes no es un gran problema).

Hicimos esto para un sistema de muy alto rendimiento, y funcionó maravillosamente, redujo nuestros problemas de rendimiento debido a las asignaciones y la fragmentación del montón dramáticamente y era completamente transparente para el resto del código.

+1

No estoy seguro de qué sistema operativo ha probado. Pero el administrador de montón de Windows ya usa este enfoque. Me sorprendería que otros no lo hagan de esta manera. –

+1

La administración de la memoria C++ está optimizada para pequeños bloques que aparecen y desaparecen rápidamente. Es probable que el programador promedio no funcione para tratar de volver a optimizarlo. Además, la descripción que proporciona arriba es un esquema muy común utilizado por casi todos los sistemas de administración de memoria. Volver a implementarlo no proporcionará ningún beneficio. –

+0

¿Hasta qué tamaño funciona la optimización de asignación de bloques pequeños en general? Me interesan las versiones recientes de GCC en particular. –

0

Lo hace en los casos que desee controlar la asignación de memoria para algún objeto. Como cuando tiene objetos pequeños que solo se asignarían en el montón, podría asignar espacio para objetos de 1k y usar el nuevo operador para asignar primero objetos de 1k y para usar el espacio hasta agotarlo.

3

Algunas razones para la sobrecarga de operador nueva

  1. de seguimiento y el perfilado de la memoria, y para detectar pérdidas de memoria
  2. Para crear piscinas objeto (decir para un sistema de partículas) para optimizar el uso de memoria
11

Algunas razones para sobrecargar por clase
1. Instrumentación, es decir, seguimiento de los allocs, pistas de auditoría en la persona que llama, como archivo, línea, pila.
2. Rutinas de asignación optimizadas, es decir, grupos de memoria, asignadores de bloques fijos.
3. Asignadores especializados i.e asignador contiguo para objetos 'asignar una vez al inicio': se usa con frecuencia en la programación de juegos para memoria que debe persistir durante todo el juego, etc.
4. Alineación. Esta es una gran aplicación en la mayoría de los sistemas que no son de escritorio, especialmente en las consolas de juegos donde con frecuencia debe asignar, p. Límites de 16 bytes
5. Almacenes de memoria especializada (otra vez en su mayoría sistemas no de escritorio) como memoria no almacenable o memoria no local