Array besser als Referenz Zeiger oder ... an Funktion übergeben



  • Hallo,

    Ich möchte ein Array in einer Funktion lesen aber nicht schreiben. Das ganze sollte möglichst mit geringer Laufzeit passieren.
    Wenn ich das array mit call by value übergebe wird es kopiert. Also müßte doch die Variante mit reference oder pointer schneller sein?
    Richtig?

    Weil in Büchern liest man meist die Variante mit call by value. Das ist dann aber nur besser um ein ändern der Variabeln in der Funktion zu verhindern.
    oder?

    {
    ...
    int abc[großes Array];
    foo1(abc);
    ...

    }
    call by reference
    void foo1(int *abc){}

    oder
    call by Value
    void foo2(int abc[großes Array]){}

    oder
    call by pointer
    void foo3(int (&abc)[großes Array]){}



  • int abc[großes Array];
    
    // Pointer
    void foo1(int *abc) {}
    
    // Pointer
    void foo2(int abc[großes Array]) {}
    
    // Reference (glaub ich)
    void foo3(int (&abc)[großes Array]) {}
    


  • flexbex schrieb:

    Hallo,
    Wenn ich das array mit call by value übergebe wird es kopiert. Also müßte doch die Variante mit reference oder pointer schneller sein?
    Richtig?

    Nein, ein Array degeneriert zu einem Pointer, wenn du es an eine Funktion übergibst. In der Funktion hast du also nicht ein Array sondern einen Pointer auf ein Array. Es wird also nur ein Pointer übergeben und nicht das ganze Array kopiert.
    Deshalb einfach void foo1(const int *abc){} verwenden (das const wenn du nur lesen darauf zugreifen möchtest).



  • flexbex schrieb:

    Wenn ich das array mit call by value übergebe wird es kopiert.

    arrays zerfallen beim übergeben an eine funktion afaik in einen pointer. es besteht also keine direkte schreibweise fürs kopieren des gesamten speichers.
    erwarte einfach einen pointer (und die grösse falls du es nicht mit templates machen willst) als argument(e) oder du machst es mit iteratoren.



  • [snip]
    [/snip]



  • dankeschön!
    was heist den dieses
    [snip]
    [\snip]
    von docshoe



  • flexbex schrieb:

    dankeschön!
    was heist den dieses
    [snip]
    [\snip]
    von docshoe

    Er hatte was geschrieben, dann aber wieder gelöscht, weil er sah, daß bereits alles prima gesagt wurde.

    Das Löschen würde einen leeren Beitrag erzeogen, aber leerer Text wird von der Forensofftware abgelehnt. Also schreibt man was rein, wie *gelöscht*, ..., [c][/c] oder so. DocShoes Tags sehen natürlich für Programmierer auch sehr hübsch aus.


Log in to reply