vectores tipos nombres matrices libreria ejemplos cadenas arreglos arreglo almacenar c++ memory stl vector overhead

c++ - tipos - ¿Cuál es el costo general de un vector vacío?



tipos de arreglos en c++ (6)

Depende de la implementación, probablemente un puntero y dos enteros para el tamaño y la capacidad actuales.

¿Cuál es la sobrecarga de memoria de tener un vector vacío vs tener un puntero a un vector?

Opción A:

std::vector<int> v;

Opción B:

std::vector<int> *v = NULL;

Creo que la opción B toma 1 puntero de 32 bits (suponiendo 32 bits aquí) ¿Cuánta memoria ocupa la ''v'' vacía?


En Visual Studio Community 2017 (Versión 15.2), ejecutando este código:

#include <iostream> #include <vector> using namespace std; void main() { vector<float> test; vector<float>* test2 = &test; cout << sizeof(test) << "/n"; cout << sizeof(test2) << "/n"; cout << "/n"; system("pause"); }

Corriendo en 32 bits (x86), obtengo 16 bytes para el vector y 4 bytes para el puntero del vector.

Corriendo en 64 bit (x64), obtengo 32 bytes para el vector y 8 bytes para el puntero del vector.


En cuanto a la pregunta como se hizo: depende de la implementación. Con MSVC 7.1 esto:

std:: cout << sizeof(std::vector<int>) << std::endl;

me da 16 (bytes). (3 punteros: comienzo, final y final de capacidad, más un asignador)

Sin embargo , debe tenerse en cuenta que el puntero-vector le da una mayor sobrecarga:

  • en tiempo y espacio en el caso no vacío
  • en complejidad en todos los casos.

Es completamente dependiente de la implementación y no debe suponer ni confiar en los detalles. Por lo que vale, son 20 bytes usando VC.


VS2005:

std::vector<int> *ptrToVec = new std::vector<int>(); std::vector<int> vecOfInt; sizeof(ptrToVec) = 4 sizeof(vecOfInt) = 20

¡Gracias!


std::vector v; toma sizeof(v) espacio. Puede variar según la implementación, así que ejecútelo y descubra cuánto le cuesta.