2009-10-29 13 views
17

Si std :: vector y amigos son auto cambio de tamaño, ¿significa que si declaro un vector de este modo:contenedores STL en la pila y el montón

std::vector<string> myvec; 

entonces va a cambia de tamaño en el uso de más de pila, mientras :

std::vector<string> *myvec = new std::vector<string>(); 

¿Cambiaría el tamaño usando más montón?

+2

También puede implementar un vector de "tamaño fijo" para almacenar todo esto en la pila. Funciona bastante bien y puede ser una optimización. Sin embargo, el costo es que no será infinitamente extensible> tendrá que conformarse con un límite alto, y siempre consumirá tanto espacio. –

+0

Eso es interesante, ¿entonces un vector de "tamaño fijo" está completamente en la pila? – Benj

+1

No conozco un vector de 'tamaño fijo', pero si quiere sus datos fijos en la pila, considere usar std :: tr1 :: array, que parece similar. – stefaanv

Respuesta

24

Los vectores asignan en el montón en sus partes internas.

Lo único que paga en la pila de un bector basado en la pila es un par de bytes, el búfer interno siempre se asignará desde el montón.

De manera efectiva cuando haces un vec = new vector() estás asignando una pequeña cantidad, que puede no ser realmente buena.

+0

Ah ok, entonces ¿los vectores declarados en la pila eliminan la memoria que usaron una vez que salieron del alcance? – Benj

+0

@Benj: Sí, limpiarán la memoria cuando salgan del alcance. – Naveen

+6

@Benj: tenga en cuenta que los vectores solo limpian la memoria que se asignaron. Si agrega objetos asignados en el montón (con 'nuevo') a un vector, entonces usted es responsable de llamar 'eliminar' en ellos. Tal vez ya sabías esto, pero quería mencionarlo por si acaso ... – StackedCrooked

1

std :: vector siempre tiene su búfer asignado en el montón. Por lo tanto, independientemente de dónde se asigne el vector en sí, el cambio de tamaño solo afectará al montón.

8

En el primer caso, está creando el vector en la pila. Eso no significa que todos los vectores de objetos internos estén en la pila también. De hecho, el vector aún asignará la memoria requerida para mantener los objetos solo en el montón. Esto se debe a que, para asignar en la pila, debe saber cuántos objetos crear. Pero esta información no está disponible, por lo que la única opción restante es asignar la memoria para el objeto contenido de Heap.

+0

También se debe tener en cuenta que es común que std :: string conserve algunos de sus "objetos" internos en la pila. En realidad, ¿se prohíbe a std :: vector hacer eso? –

Cuestiones relacionadas