R-value referenzen und STL



  • eine frage die mir gerade eingefallen ist:

    R-value referenzen bringen einen perfomance-vorteil. werden die Compilerhersteller die STL jetzt mit R-value referenzen designen?


  • Mod

    oiiiooio schrieb:

    eine frage die mir gerade eingefallen ist:

    R-value referenzen bringen einen perfomance-vorteil. werden die Compilerhersteller die STL jetzt mit R-value referenzen designen?

    Da die Implementierung der STL nicht vorgegeben ist und sich sowas immer gut macht um damit anzugeben: Wahrscheinlich ja.

    Erwarte aber keine Performance-Wunder durch R-value Referenzen. Vermutlich wirst du niemals etwas davon merken.



  • oiiiooio schrieb:

    werden die Compilerhersteller die STL jetzt mit R-value referenzen designen?

    "designen" ist vielleicht übertrieben. Erweitern, ja. Sie sollten es. Es steht ja so im kommenden Standard. Beispiel:

    template <class T>
    class vector {
      ...
      vector(vector const&); // copy ctor
      vector(vector &&);     // move ctor
      ...
      void push_back(T const&);
      void push_back(T &&);
      ...
      template<class Args>
      void emplace_back(Args&&...args);
    };
    

    Neben copy/move Konstruktoren bietet vector ein überladenes push_back und emplace_* Funktionen, die die Objekte direkt im Container durch Weiterleitung der Konstruktor-Argumente erzeugen, statt ein bestehendes Objekt kopieren.

    Und die Container werden auch Typen verarbeiten können, die nicht kopierbar, dafür aber "move-bar" sind, wie zB unique_ptr<int>.



  • Um beim Beispiel des Vektors zu bleiben: Der will sich ja ggf vergrößern und muss Elemente dabei umkopieren. Bietet jetzt der Elementtyp einen nothrow-Move-Konstruktor an, müssen die Elemente beim Vergrößern des Vektors nicht mehr kopiert werden. Sie "ziehen einfach um" aus einen Puffer in den neuen größeren.

    Aber nicht nur bei Containern und Strings werden Rvalue-Referenzen eingesetzt. Du wirst sie zB auch bei den Funktions-Objekten (Header <functional>) und beim variadischen std::thread Konstruktor (Header <thread>) finden. Dort geht es um das Weiterleiten von Parametern an andere Funktionen. Dafür ist && auch zu gebrauchen.

    kk


Log in to reply