vectors remove new initialize c++ memory-management stdvector

c++ - remove - ¿Está garantizado que la construcción por defecto de std:: vector no se llame nueva?



std vector push back (2)

De acuerdo con la referencia a simple std::vector<T> vec; crea un contenedor emtpy (constructor por defecto). ¿Esto garantiza que no hay asignación de memoria dinámica? ¿O puede una implementación optar por reservar algo de memoria?

Sabía que, para este constructor vacío, no hay ninguna construcción del tipo T desde C ++ 11. Sin embargo, me pregunto si también hay una garantía de que no se asigna nada en el montón. Es decir, que la línea anterior es solo un nullptr en stack / member.

Lo probé con vc140, donde de hecho está libre de asignaciones dinámicas.


¿Esto garantiza que no hay asignación de memoria dinámica?

No. Sin embargo, es bastante típico que una implementación no asigne memoria. No he visto una implementación de biblioteca estándar que lo hace.

¿O puede una implementación optar por reservar algo de memoria?

Puede, pero eso es atípico.

Sabía que, para este constructor vacío, no hay ninguna construcción del tipo T desde C ++ 11

También antes de C ++ 11.


La biblioteca estándar es parte del lenguaje C ++.

Casi cualquier llamada a cualquier clase de biblioteca estándar o función podría hacer cosas patológicas y de locura. Pero lo mismo es cierto de int x=7; - el estándar no está escrito para defenderse contra implementaciones C ++ francamente hostiles, que incluyen la biblioteca estándar.

Dicho esto, el constructor de argumento cero para el vector estándar es noexcept. Esto significa que está destinado a no asignar. Una implementación hostil es libre de asignar, detectar cualquier error y continuar sin importar si la asignación tuvo éxito. Una implementación hostil también es gratuita para contar hasta 47 billones, ejecutar FFT en datos aleatorios, girar una red neuronal y entrenarla contra Shakespeare, componer algunos sonetos y luego proceder como si nada hubiera pasado. El estándar no tiene nada que decir sobre la composición de poesía inobservable de cualquier operación en C ++; mientras la acción no tenga efectos secundarios observables (dentro de la máquina abstracta), el estándar no tiene opinión.

En la práctica, no hay razón para que std::vector<T>() asigne, y ninguna operación posterior puede asumir que se asignó. Pude ver una compilación instrumentada que asigna algún token de seguimiento de por vida para hacer cumplir los errores de invalidación del iterador, pero eso solo se habilitaría en la depuración con -DCMP_JUN17 adicionales (por ejemplo, -DCMP_JUN17 ).

Preocúpate más por la poesía que por una llamada a lo nuevo.