std::realloc
es peligroso en C++ si la memoria malloc'd contiene tipos no pod. Parece que el problema solo es que std::realloc
no llamará a los destructores de tipo si no puede hacer crecer la memoria in situ.El uso de realloc en C++
Una solución trivial sería una función try_realloc
. En lugar de mallocrar la nueva memoria si no se puede cultivar in situ, simplemente devolvería falsa. En ese caso, se podría asignar nueva memoria, copiar los objetos (o moverlos) a la nueva memoria y finalmente liberar la memoria anterior.
Esto parece sumamente útil. std::vector
podría hacer un gran uso de esto, posiblemente evitando todas las copias/reasignaciones.
pirorretardante preventivo: Técnicamente, ese es el mismo rendimiento de Big-O, pero si el crecimiento del vector es un cuello de botella en su aplicación, una aceleración x2 es agradable incluso si el Big-O permanece inalterado.
PERO, no puedo encontrar ninguna API que funcione como try_realloc
.
¿Echo de menos algo? ¿try_realloc
no es tan útil como me lo imagino? ¿Hay algún error oculto que hace inutilizable try_realloc
?
Mejor aún, ¿hay alguna API menos documentada que funcione como try_realloc
?
NOTA: Obviamente, aquí, en código específico de biblioteca/plataforma. No estoy preocupado ya que try_realloc
es intrínsecamente una optimización.
Actualización: siguiente comentario Steve Jessops es en si vector
sería más eficiente el uso de realloc escribí una prueba de concepto para probar. El realloc-vector
simula el patrón de crecimiento de un vector, pero tiene la opción de realloc en su lugar. Ejecuté el programa hasta un millón de elementos en el vector.
Para comparar un vector
debe asignar 19 veces mientras crece a un millón de elementos.
Los resultados, si el realloc-vector
es lo único que utiliza el montón, los resultados son impresionantes, la asignación de 3-4 crece al tamaño de millones de bytes.
Si el realloc-vector
se usa junto con un vector
que crece al 66% de la velocidad del realloc-vector
Los resultados son menos prometedores, asignando 8-10 veces durante el crecimiento.
Por último, si el realloc-vector
se utiliza junto con un vector
que crece al mismo ritmo, el realloc-vector
asigna 17-18 veces. Apenas se guarda una asignación sobre el comportamiento del vector estándar.
No dudo que un hacker pueda asignar tamaños de asignación para mejorar los ahorros, pero estoy de acuerdo con Steve en que el tremendo esfuerzo para escribir y mantener dicho asignador no es la ganancia.
Es difícil proporcionar sugerencias específicas de la plataforma sin tener idea de la plataforma a la que desea orientar sus anuncios. –
Mi objetivo es gcc + Linux. Sin embargo, en general tengo curiosidad por lo que se considerará una solución en cualquier plataforma. –
No puedo evitar pensar: si quieres el mejor rendimiento, utiliza vector.reserve() para que no tengas que hacer crecer el vector. –