Zeiger, Referenzen oder Variablen??



  • Es gibt Bibliotheken, welche komplett auf Zeiger setzen oder auch welche, die mit Referenzen mischen.

    Heisst das Zeiger als Parameter haben den selben Zweck wie Referenzen?
    Also Speicher sparen?



  • Dweb schrieb:

    Wieso lohnt es sich nicht Referencen bei kleinen Objekten zu benutzen 😕

    Weil der Overhead durch die Indirektion (Dereferenzierung kostet) und den benötigten Speicherplatz grösser ist, als wenn das Objekt kopiert wird.

    Das bezieht sich natürlich auf Const-Referenzen. Wenn das Objekt verändert werden muss, kann es logischerweise nicht kopiert werden.

    Neophyte schrieb:

    Heisst das Zeiger als Parameter haben den selben Zweck wie Referenzen?
    Also Speicher sparen?

    Nicht primär Speicher sparen. Teilweise will man Zeit durch unnötige Kopien sparen, oft geht es aber um die Indirektion (man will ein Objekt verändern, oder einen Zeiger/eine Referenz darauf für den weiteren Gebrauch speichern).



  • Dweb schrieb:

    drakon schrieb:

    Für kleine Objekte kann es sich auch nicht lohnen Referenzen zu benutzen, sondern gleich eine Kopie zu erstellen.

    Wieso lohnt es sich nicht Referencen bei kleinen Objekten zu benutzen 😕

    Weil kleine Objekten nur sehr geringen Speicherbedarf haben, und es hier kaum ins Gewicht fällt, wenn man hier eine komplette Kopie des Originals erstellt.
    Edit: Zu langsam 🙄

    Neophyte schrieb:

    Es gibt Bibliotheken, welche komplett auf Zeiger setzen oder auch welche, die mit Referenzen mischen.

    Heisst das Zeiger als Parameter haben den selben Zweck wie Referenzen?
    Also Speicher sparen?

    Im Grunde ja, doch sind Referenzen im Endeffekt etwas einfacher zu handhaben (ähnlich wie bei normalen Variablen).

    Konstanten werden gebraucht, wenn der eingegebene Wert nicht mehr verändert werden soll.



  • Nexus schrieb:

    Dweb schrieb:

    Wieso lohnt es sich nicht Referencen bei kleinen Objekten zu benutzen 😕

    Weil der Overhead durch die Indirektion (Dereferenzierung kostet) und den benötigten Speicherplatz grösser ist, als wenn das Objekt kopiert wird.

    meintest du "... und den dafür benötigten Speicherplatz grösser ist, als wenn man das Objekt koiert", nexus?

    Also er Overhead für die Reference braucht halt mehr Speicher als das Objekt einfach zu kopieren, richtig so ? 🙂


  • Mod

    Dweb schrieb:

    Nexus schrieb:

    Dweb schrieb:

    Wieso lohnt es sich nicht Referencen bei kleinen Objekten zu benutzen 😕

    Weil der Overhead durch die Indirektion (Dereferenzierung kostet) und den benötigten Speicherplatz grösser ist, als wenn das Objekt kopiert wird.

    meintest du "... und den dafür benötigten Speicherplatz grösser ist, als wenn man das Objekt koiert", nexus?

    Also er Overhead für die Reference braucht halt mehr Speicher als das Objekt einfach zu kopieren, richtig so ? 🙂

    Er meint den Overhead zeitlich: Kopieren kostet einmal am Anfang Zeit proportional zur Objektgröße. Benutzen von Referenzen kostet bei jedem Zugriff ein kleines bisschen Zeit, unabhängig von der Objektgröße. Ab wann sich Referenzen gegenüber Kopien zeitlich lohnen ist daher abhängig von der Objektgröße und wie oft man darauf zugreift. Als Faustregel lohnt sich bei den primitiven Datentypen die Referenz zeitlich nie und ab einer Objektgröße von ein paar Dutzend Byte ist tendenziell die Referenz überlegen.



  • SeppJ schrieb:

    Er meint den Overhead zeitlich: Kopieren kostet einmal am Anfang Zeit proportional zur Objektgröße. Benutzen von Referenzen kostet bei jedem Zugriff ein kleines bisschen Zeit, unabhängig von der Objektgröße.

    Wichtig ist, dass zur Laufzeit auch Referenzparameter kopiert werden (von inline abgesehen). Referenzen benutzen keine Magie, auch sie brauchen Speicher, um auf Objekte zu verweisen. Auf vielen Systemen ist z.B. sizeof(int*) == sizeof(int) , bei einer Referenz sollte es auf das gleiche hinauslaufen.

    int Add(const int& lhs, const int& rhs) // 2 Referenzen kopiert (z.B. 8 Byte)
    {
        return lhs + rhs; // 2 Dereferenzierungen
    }
    
    int Add2(int lhs, int rhs) // 2 ints kopiert (z.B. 8 Byte)
    {
        return lhs + rhs; // 0 Dereferenzierungen
    }
    

    Das Gesagte bezieht sich auf Implementierungen in der Praxis, der C++-Standard macht keine Aussagen über die Darstellung oder den Speicherplatzbedarf von Referenzen.



  • @Nexus:
    Findet die Dereferenzierung nicht sonst vor Aufruf von Add2 statt,
    wenn man zwei Variablen verwendet?



  • Braun-Bär Bruno schrieb:

    @Nexus:
    Findet die Dereferenzierung nicht sonst vor Aufruf von Add2 statt,
    wenn man zwei Variablen verwendet?

    Wie meinst du das genau?

    int a = 3;
    int b = 4;
    
    Add2(a, b); // keine Dereferenzierung, nur Kopien
    


  • ups...

    War wohl etwas spät und ich a little bit sleepy...
    Nehm alles zurück...



  • Nexus schrieb:

    Das Gesagte bezieht sich auf Implementierungen in der Praxis, der C++-Standard macht keine Aussagen über die Darstellung oder den Speicherplatzbedarf von Referenzen.

    allse klar :), in dem c++ Literatur die ich habe steht n#mlich immer, dass Referencen keinen Speicher allokieren.... aber so stimmt das ja dann gar net 😃


  • Administrator

    Dweb schrieb:

    Nexus schrieb:

    Das Gesagte bezieht sich auf Implementierungen in der Praxis, der C++-Standard macht keine Aussagen über die Darstellung oder den Speicherplatzbedarf von Referenzen.

    allse klar :), in dem c++ Literatur die ich habe steht n#mlich immer, dass Referencen keinen Speicher allokieren.... aber so stimmt das ja dann gar net 😃

    Die Aussage ist aber richtig. Eine Referenz ist nur ein Verweis auf ein Objekt. Wenn du lokal eine Referenz benutzt, wird diese meistens direkt wegoptimiert. Bei der Übergabe einer Referenz, sofern nicht "ge-inlined" wird, kommt man aber um das Kopieren eines Zeigers kaum herum, wodurch halt etwas Speicher benötigt wird. Du wirst diesen Speicher aber von deinem Programm aus, nie vernünftig ansteuern können, da eine Referenz grundsätzlich keinen Speicher benötigt, es aber Implementierungsabhängig ist, ob nicht doch etwas verwendet wird. 😉

    Die Aussage stimmt somit nach Sprachdefinition, kann aber in der tatsächlichen Praxis ein wenig anders aussehen. Sie ist vielleicht ein wenig zu allgemein und einfach gehalten 🙂

    Grüssli



  • Neophyte schrieb:

    Bisher habe ich Zeiger immer dann benutzt wenn man den Speicherplatz für den Parameter wieder freigeben können sollte...

    Das halte ich für sehr gefährlich. Allokation und Freigabe sollten IMHO nie getrennt voneinander erfolgen.


Anmelden zum Antworten