2009-02-17 10 views
23

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

Opción A:

std::vector<int> v; 

Opción B:

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

creo que la opción B tiene 1 32 puntero de bits (suponiendo 32 bits aquí) ¿Cuánta memoria del vacío 'v' ¿comenzar?

+0

Sería bueno saber a qué intenta llegar con esta pregunta. ¿Está buscando hacer una selección de ellos y desea saber cuánto espacio ahorra al convertirlo en una serie de indicadores? Si es así, probablemente haya otros problemas que debe conocer. –

Respuesta

0

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

5

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

+0

¿Y qué ocurre con la memoria dinámica utilizada internamente por el vector? –

+1

Un vector construido por defecto no tiene tamaño y nunca tuvo ninguno, por lo que no debería tener una asignación dinámica. –

12

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.

+0

En GCC 4.6, es 12 bytes. Asumiría 4 bytes para el puntero, 4 bytes para el tamaño y 4 bytes para la capacidad. – Joel

31

En cuanto a la pregunta formulada: Depende de la implementación. Con MSVC 7.1 esto:

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

me da 16 (bytes). (3 punteros: comenzar, terminar, y al final de la capacidad, además de un asignador)

Sin embargo cabe señalar que el vector de puntero a le da una sobrecarga mayor:

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

tu último punto es muy bueno. +1 para eso –

+0

¿Por qué un puntero-vector tiene una sobrecarga mayor? –

+0

@Legate: porque tiene que agregar el tamaño del puntero al tamaño del vector –

3

VS2005:

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

sizeof(ptrToVec) = 4 
sizeof(vecOfInt) = 20 

Gracias!

1

En Visual Studio 2017 Comunidad (Versión 15.2), la ejecución de 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"); 
} 

Correr en 32 bits (x86), me sale 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.

Cuestiones relacionadas