Vektorspeicherzuweisungsstrategie

Ich habe ein kleines Stück Code geschrieben, um festzustellen, wie die Speicherzuweisung in einem Vektor erfolgt.

#include <iostream>
#include <vector>
using namespace std;
int main ()
{
  vector<unsigned int> myvector;
  unsigned int capacity = myvector.capacity();

  for(unsigned int i = 0; i <  100000; ++i) {
    myvector.push_back(i);
    if(capacity != myvector.capacity())
    {
      capacity = myvector.capacity();
      cout << myvector.capacity() << endl;
    }
  }
  return 0;
}

Ich habe dies mit Visual Studio 2008 und g ++ 4.5.2 unter Ubuntu kompiliert und die folgenden Ergebnisse erhalten:

Visual Studio:

1 2 3 4 6 9 13 19 28 42 63 94 141 211 316 474 711 1066 1599 2398 3597 5395 8092 12138 18207 27310 40965 61447 92170 138255

capacity = capacity * 1.5;

g ++:

1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072

capacity = capacity * 2;

Wie Sie sehen, sind dies zwei sehr unterschiedliche Ergebnisse. Warum ist das so? Kommt es nur auf den Compiler an oder ist es von anderen Faktoren abhängig?

Ist es wirklich sinnvoll, die Kapazität auch bei einer großen Anzahl von Elementen weiter zu verdoppeln?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage