Frage

Ich habe eine Frage über die std :: vector.

Ich habe einen sehr speicherintensiven Algorithmus, wo ich forsee dass Vektorgrößen Vorhersage und genügend Speicher für die Vektoren im Voraus reserviert wird mir helfen, viel mit Speicherverbrauch zu reduzieren.

Welche der folgenden ist besser:

for ( ... ) {
  std::vector<Type> my_vector;
  my_vector.reserve(stuff_count);
  // Do stuff , and append stuff to my_vector.
}

Oder diese:

std::vector my_vector;
for ( ... ) {
  my_vector.clear();
  my_vector.reserve(stuff_count);
  // Do stuff , and append stuff to my_vector.
}

Bitte sagen Sie mir, was am besten ist, oder wenn es eine noch bessere Möglichkeit Sachen zu tun.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Mit der ersten Variante umverteilen Sie den Puffer des Vektors auf jeder Iteration - das ist in der Regel recht teuer. Mit der zweiten Variante umverteilen Sie nur gelegentlich. Die zweite Variante ist besser, da Geschwindigkeit eine Priorität für Sie.

Es ist unklar, von Ihnen, wo die Anzahl der Elemente in Frage stellen ist weiß aus. Vielleicht können Sie auch schnell die maximale Anzahl der Elemente für alle Iterationen berechnen, setzen diese die Puffergröße zu sein und haben keine Umverteilung.

Andere Tipps

  

I forsee dass Vektorgrößen Vorhersage und genügend Speicher für die Vektoren im Voraus reserviert wird mir helfen, viel mit Speicherverbrauch zu reduzieren.

Versuchen Sie, und handeln wie ein Ingenieur kein Wahrsagerin. Erstellen Sie einen Test, und die Differenz messen.

Die zweite könnte etwas schneller sein, aber ich finde die erste Reiniger.

Da die Unterschiede im Code sind trivial, warum nicht beide Ansätze testen und sehen, was am besten für Ihre Anwendung funktioniert?

Es hängt ein wenig darüber, wie Typ konstruiert werden muss / destructed, würde ich sagen. Wenn es ein POD ist, die nicht Zerstörung erfordert, können Sie die clear () überspringen, die alle Destruktoren in einer Schleife aufruft, und es als statisches Array verwenden, anstatt:

std::vector<Type> my_vector(size);
for (...)
{
  int index = 0;
  // Do stuff
  my_vector[index] = some_value;
}

(Caveat: Code ungetestet)

  

... reserviert genug Speicher für die   Vektoren im Voraus wird mir sehr helfen   mit der Verringerung der Speichernutzung

err ... was ?! Das macht überhaupt keinen Sinn. Speicher beanspruchen hilft nicht, die Speichernutzung in irgendeiner Weise mit zu reduzieren. Es verhindert die Notwendigkeit einer ständigen Umverteilung, die Dinge schneller, aber so weit wie Verwendung geht man keinen Nutzen erhalten.

Die zweite wird die maximale Speicher aller Verwendungen es durch die Schleife verwenden, das heißt, die maximale Größe von Typen von stuff_count. std::vector::clear() nicht unbedingt freien Speicher . Das heißt, wenn Sie std::vector::capacity() vor und nach std::vector::clear() einer Standard-konforme Implementierung nennen könnte den gleichen Wert zurück.

Am besten werden Sie die Anzahl, wie oft Sie reduzieren Speicher mit dem obigen Schema zuordnen. Aber Sie werden sicherlich nicht den Speicherbedarf an jedem beliebigen Punkt zu reduzieren. Wenn Sie auf den reservierten Speichermenge verkleinern möchten, sollten Sie den Vektor-Swap-Idiom verwenden:

std::vector<type>().swap(my_vector);
my_vector.reserve(stuff_count); 

oder die erste Lösung, da die Gesamtwirkung wird das gleiche sein.

Wenn Sie eine Menge Appends tun verwenden std :: deque statt std :: vector und verwenden nur "push_back".

Wie wäre es?

std::vector<DataType> my_vector;
my_vector.resize(sizeof(yourData));
memcpy(reinterpret_cast<char*>(&my_vector), &yourData, sizeof(yourData));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top