2009-02-17 5 views
23

Welchen Speicherbedarf hat ein leerer Vektor gegenüber einem Zeiger auf einen Vektor?Wie hoch sind die Gemeinkosten eines leeren Vektors?

Option A:

std::vector<int> v; 

Option B:

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

Ich glaube, dass Option B dauert 1 32-Bit-Zeiger (unter der Annahme, 32-Bit-hier) Wie viel Speicher hat die leere 'v' aufheben? abhängig

+0

Es wäre schön zu wissen, was Sie mit dieser Frage erreichen wollen. Möchten Sie ein Array von ihnen erstellen und wissen, wie viel Speicherplatz Sie sparen, indem Sie ein Array von Zeigern erstellen? Wenn ja, gibt es wahrscheinlich einige andere Probleme, über die Sie wissen sollten. –

Antwort

0

Implementierung, wahrscheinlich ein Zeiger und zwei ganzen Zahlen für aktuelle Größe und Kapazität.

5

std::vector v; nimmt sizeof(v) Platz. Es kann je nach Implementierung variieren, also starte es und finde heraus, wie viel es für dich braucht.

+0

Und was ist mit dynamischem Speicher, der intern vom Vektor verwendet wird? –

+1

Ein standardmäßig konstruierter Vektor hat keine Größe und hatte keine, daher sollte er keine dynamische Zuweisung haben. –

12

Es ist völlig abhängig von der Implementierung und Sie sollten weder annehmen noch auf die Details verlassen. Für was es sich lohnt, ist es 20 Bytes mit VC.

+0

Bei GCC 4.6 sind es 12 Bytes. Ich würde 4 Bytes für den Zeiger, 4 Bytes für die Größe und 4 Bytes für die Kapazität annehmen. – Joel

31

Wie für die Frage, wie gefragt: Es hängt von der Implementierung ab. Mit MSVC 7.1 dies:

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

gibt mir 16 (Bytes). (3 Zeiger: Beginn, Ende, und das Ende der Kapazität sowie einen Zuordner)

jedoch es sollte angemerkt werden, dass der Zeiger-Vektor ihm einen größeren Overhead ergibt:

  • in Zeit und Leerzeichen im nicht leeren Fall
  • in allen Fällen in Komplexität.
+3

Unser letzter Punkt ist sehr gut. +1 dafür –

+0

Warum hat ein Zeiger-zu-Vektor einen größeren Aufwand? –

+0

@Legate: beause du musst die Größe des Zeigers selbst zu der Größe des Vektors hinzufügen –

3

VS2005:

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

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

Dank!

1

In Visual Studio Gemeinschaft 2017 (Version 15.2), läuft diesen Code:

#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"); 
} 

in 32-Bit-Betrieb (x86), erhalte ich 16 Bytes für den Vektor und 4 Bytes für den Vektor-Zeiger.

in 64-Bit-Betrieb (x64), erhalten I 32 Bytes für den Vektor und 8 Bytes für den Vektor-Zeiger.

Verwandte Themen