pass std::vector by value



  • Mich interessiert, wieso man std::vector instanzen per-reference an functions übergeben soll, wenn es sich doch eigentlich nur um einen Verweis auf eine speicheradresse auf dem Heap handelt. Das müsste doch günstig zu kopieren sein. Ich verstehe, dass bei std::array das gesamte Array kopiert würde, aber bei std::vector erschließt sich mir das Ganze nicht so. Liegt es an dem Overhead den die Klasse mitbringt?



  • Der vector wird im Gegensatz zum array nicht kopiert?



  • brainfreeze, hast natürlich recht. der payload wird natürlich auch mitkopiert. ist ja kein copy-on-write ; )



  • Eine Referenz auf einen Vektor, sofern die Länge des Vektors nicht beeinflusst werden soll, ist vielleicht trotzdem ungeschickt. Man hüpft dann zweimal im Speicher, um auf die Daten zu kommen und ist auf std::vector angewiesen, obwohl die Funktion allgemeiner sein könnte.

    Alternativ kann man einen Datentypen als Parameter benutzen, der sich auf ein (Teil eines) Array bezieht aber die Elemente nicht besitzt: span . Ich mag span . Man findet das in der GSL (guideline support library).

    void show(span<const double> arr) {
        for (auto v : arr) {
            cout << v << '\n';
        }
    }
    
    int main() {
        vector<double> a = {2.0, 3.0, 5.0};
        double b[] = {1.4142, 3.14159, 2.7183};
        show(a);
        show(b);
        show({b+1, 2});
    }
    

    So ein span würde man "by-value" entgegen nehmen, wobei es diverse implizite Konvertierungen zulässt (von T[N] , array<T,N> , vector<T> ), die es einem abnehmen, die richtige Länge zu spezifizieren. Das vermeidet im Vergleich zu zwei Parametern (Pointer + Länge) ein paar Fehler und ist angenehmer aufzurufen.


Anmelden zum Antworten