msvc - c++ modules visual studio



vectors emplace_back (2)

Es gibt tatsächlich zwei Dinge, die in emplace_back passieren:

  1. Sie übergeben kein Objekt vom Typ T, sondern Argumente an einen Konstruktor von T. Auf diese Weise wird die Objektkonstruktion verzögert: Der Vektor wird erweitert, um dem vom neuen Objekt benötigten Speicher gerecht zu werden, und der Konstruktor wird aufgerufen, um das Objekt zu initialisieren im Vektor. Variadische Vorlagen haben nichts mit Kopien zu tun, sie erlauben nur die Weiterleitung einer variablen Anzahl von Argumenten an den Konstruktor.
  2. Argumente für die Konstruktoren selbst werden nicht kopiert, da sie als rvalues-Referenzen übergeben werden und std :: move verwendet wird, um sie an den Konstruktor weiterzuleiten. Im Wesentlichen vermeiden Verschiebungssemantiken tiefe Kopien von Objekten.

https://ffff65535.com

Können Sie mir bitte erklären, wie "perfektes Weiterleiten" funktioniert?

Ich habe gelesen, dass der emplace_back des Vektors keine Objekte kopieren oder verschieben muss, weil sein Argument als variadisches Template implementiert ist.

std::vector<T>::emplace_back(_Args&&... __args)

Kannst du es genauer beschreiben? Warum wird es nicht kopieren oder bewegen?


emplace_back konstruiert das Element direkt an der richtigen Position im Vektor. Denken Sie darüber nach, als ob

vector<T> v;
v.emplace_back(a,b,c);

wird umgewandelt in (idx ist der neue Index)

new (v.data()+idx) T(a,b,c);

(Die Realität ist ein bisschen komplexer, indem die Argumente als std::forward<_Args>()... aber das könnte verwirrender sein, um den Schlüssel von emplace-Operationen zu erhalten)





c++11