Referenz auf normale Datentypen bei Funktionaufruf sinnvoll?



  • Hallo, wenn man größere Objekte hat verwendet man ja bei Funktionen, die diese als Parameter haben entweder pointer (*) oder Referenz (&) da drauf. Ist das auch bei normalen Variablen sinnvoll?
    Und als 2. in wie weit macht da const bei der Rückgabe sinn?
    z.B

    const int foo( const int &a){...}
    
    int main(){
    
         int bar = 3;
         int res = foo(bar);
    }
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wenn du ohne Pointer/Referenz arbeitest, dann wird kopiert, sofern das akzeptiert wird. Der Unterschied zwischen beiden Übergaben, liegt an den Größen, die es zu kopieren gilt. Auf 64-bit-Systemen dürfte solch ein Pointer (oder als Referenz getarnter konstanter Pointer) immer 8 Bytes groß sein. Bei der Übergabe des Wertes wird dann wohl so viel kopiert, wie das Objekt groß ist.

    Wenn du dir jetzt mit sizeof() ausgeben könntest, welche Unterschiede das machen könntest du dann den Rest nachvollziehen.

    Bemerke dabei, dass Übergabe per Referenz/Wert zwei verschiedene Dinge sind, weil ersteres auf das gleiche Objekt referenziert, das du übergibst.

    Desweiteren wirst du in C++ zumeist Referenzen benutzen wollen und keine rohe Zeiger.


  • Mod

    (Wenn du Referenzen kennst, dann machst du C++, nicht C. Eine ganz andere Sprache. Daher verschiebe ich das mal. Prinzipiell gelten in C aber die gleichen Prinzipien, außer dass es eben keine Referenzen gibt)

    Bezüglich der Referenzübergabe kleiner Objekte: Es kann mit Referenzen etwas langsamer sein, aber das ist eher ein theoretisches Szenario. Mit Referenzen können auch nicht-kopierbare Objekte übergeben werden, was ein bisschen weniger theoretisch ist, aber zumindest bei den Basisdatentypen nicht der Fall ist.
    Also kurz: Der Unterschied ist selten relevant.

    const für Rückgabewerte: Sinnlos. Nicht machen. Es gibt ein paar unrealistische Fälle, in denen es besser wäre, und ein paar realistische Fälle, wo es aktiv schlechter ist, weil es gewisse Optimierungen verhindert. Bei nicht-Klassentypen (wie int) wird es ohnehin (fast) komplett ignoriert.



  • Danke für die Antworten (sizeof(&var)) werde ich mal testen.



  • SeppJ schrieb:

    Bei nicht-Klassentypen (wie int) wird es ohnehin (fast) komplett ignoriert.

    Mich wuerde interessieren was mit "fast" gemeint ist (ich dachte immer, dass das const in diesem Fall komplett ignoriert wird).


  • Mod

    icarus2 schrieb:

    SeppJ schrieb:

    Bei nicht-Klassentypen (wie int) wird es ohnehin (fast) komplett ignoriert.

    Mich wuerde interessieren was mit "fast" gemeint ist (ich dachte immer, dass das const in diesem Fall komplett ignoriert wird).

    Es gehört immer noch zur Funktionssignatur:

    const int foo();
    int bar();
    
    int main() {
    	int (*f)() = &foo;  // Geht nicht.
    	int (*b)() = &bar;  // Geht.
    }
    


  • Daran hatte ich nicht gedacht. Danke.


Anmelden zum Antworten