Pregunta

Estoy en una situación en la que debo usar una función de estilo c que devuelve el len copiado. Decidí que debería cambiar el tamaño al máximo, luego cambiar el tamaño a la longitud devuelta expandir el tamaño del vector pasado como memoria

Sé que redimensionar establece el valor en fillValue (¿siempre 0?). Así que habrá una inicialización sin sentido (con suerte menos de un mb cada vez) 60 veces por segundo. ¿Hay alguna manera de deshabilitar la iniciación en el cambio de tamaño?

¿Fue útil?

Solución

Básicamente no. Los elementos en el vector se construyen por defecto en un cambio de tamaño (para un entero, esto se traduce en 0).

Suponiendo que está utilizando reserve () para asegurarse de que resize () no asigna memoria, no me preocuparía por esto a menos que resulte ser un problema de rendimiento más adelante.

Si le preocupa, puede considerar simplemente usar una matriz regular y almacenar el recuento de elementos en una variable separada. Esto te dará el mejor rendimiento.

Actualización :

John preguntó:

  

¿El constructor está realmente garantizado?   a cero esa memoria? pensé que   fue indefinido?

Sí y no. Los tipos primitivos (int, bool, float, etc.) tienen constructores predeterminados que los inicializan a cero. Sin embargo, a diferencia de las clases o estructuras normales, el compilador no las llama automáticamente.

E.g

int a;         // uninitialized
int b = int(); // initialized to 0

Debido a que vector :: resize usa la última forma al agregar elementos, tiene la garantía de que los elementos creados se inicializarán correctamente en cero. Esto se aplica a todas las colecciones STL que crean elementos de forma implícita.

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