Verständnisfrage: Eingang und Ausgang einer Funktion?

  • Oft redet man im englischen aneinander vorbei.

    Folgende Verständnisfrage:


    Bisher dachte ich immer, ich setze Variablen, die einen Wert inne haben in eine Funktion als Eingangsparameter ein (also in die Klammer einer Funktion).

    Die Funktion arbeitet mit den Parametern und gibt am Ausgang (links von der Funktion) das Ergebnis heraus, das ich weiterverwenden kann für andere Sachen.


    Nun sehe ich diesen Code:```

    FVector2D ViewportSize;

    if (GEngine && GEngine->GameViewport)

    {

    GEngine->GameViewport->GetViewportSize(ViewportSize);

    }```

    Jetzt bin ich verwirrt, "ViewportSize" wird erstellt, hat aber noch keinen Wert, was bringt es dann, dies in die Funktion einzusetzen? Was soll dann dabei rauskommen, es ist ja leer. Dazu kommt noch, die Funktion wird lediglich aufgerufen, aber am "Ausgang" wird garkein Wert zurückgegeben bzw garnicht entgegengenommen.


    Es scheint so, als würde "ViewportSize" auch durch einsetzen in den Eingang einer Funktion einen Wert zugewiesen bekommen, stimmt das?

    Bisher kannte ich Werte zuweisen nur durch das "=" Zeichen.


    Bitte kann mir da einer Licht in mein Dunkel bringen^^?

    • Hilfreich

    Wenn du dir mal die Definition der GetViewportSize funktion anschaust wirst du sehen, dass diese keine Variable als Input hat, sondern eine Referenz. Irgendwie sowas:

    Code
    GetViewportSize(FVector2D& ViewportSize)


    Was also in die Funktion übergeben wird ist eine Referenz auf die vorher erstellte Variable. Diese wird dann innerhalb der Funktion gesetzt.


    Warum man das macht hat etwas mit optimierung zu tun. Anstatt dass der Struct also 2 Mal existiert (Im Stack der Aufrufenden Funktion und im Stack der aufgeruften Funktion) wird einfach eine Referenz übergeben, und direkt auf der Speicherstelle des einen Structs geschrieben.

    Die Optimierung kann bei Structs oft Sinn ergeben (und ist nach UE4 Coding Guideline empfohlen), da es sich hier ja um Typen handelt die mehrere Variablen enthalten und somit einiges an Speicher durch die Gegend kopiert werden muss, wenn man nicht mit Referenzen arbeitet. Bei einfachen Typen sollte man es eher nicht machen, da diese meist einfacher als eine Speicheraddresse sind, gerade im 64Bit Systemen.