Was passiert mit nicht verwendeten Funktionsrückgabewerten?

7

Wenn ich ein Programm habe:

%Vor%

Was passiert mit dem Rückgabewert von TestInReturn(a,b) , da dieser nicht verwendet wird?

    
xcdemon05 26.02.2013, 18:25
quelle

7 Antworten

8

Es wird verworfen ; Der Ausdruck TestInReturn(a,b) ist ein verworfener Wert . Das Verwerfen eines int hat keine Auswirkungen, aber das Verwerfen eines volatile int (oder eines anderen flüchtigen qualifizierten Typs) kann zum Lesen aus dem Speicher führen.

    
ecatmur 26.02.2013, 18:30
quelle
11

Da es sich um Windows handelt, nehmen wir einen x86-Prozessor an.

In diesem Fall befindet sich der Rückgabewert normalerweise im Register EAX. Da Sie ihn nicht verwenden, wird dieser Wert einfach ignoriert und beim nächsten Mal überschrieben, wenn etwas Code, der etwas in EAX schreibt, ausgeführt wird.

In vielen Fällen hat der Compiler, wenn eine Funktion keine anderen Nebenwirkungen hat (er nimmt nur Eingaben und gibt ein Ergebnis zurück), herauszufinden, wann Sie das Ergebnis nicht verwenden, und ruft die Funktion einfach nicht auf .

In Ihrem Fall hat die Funktion einige Nebenwirkungen, so dass sie diese Nebenwirkungen ausführen muss, aber kann Elide-Code gut sein, um die Summe zu berechnen. Selbst wenn es nicht entfernt wurde, kann es wahrscheinlich herausfinden, dass das, was hinzugefügt wird, wirklich zwei Konstanten sind, so dass es in der Regel keine tatsächliche Berechnung des Ergebnisses zur Laufzeit macht, sondern einfach etwas wie mov EAX, 2000 zu tun Erzeuge den Rückgabewert.

    
Jerry Coffin 26.02.2013 18:33
quelle
4

Der Rückgabewert wird einfach verworfen. Abhängig vom genauen Szenario kann der Optimierer den gesamten Funktionsaufruf optimieren, wenn keine beobachtbaren Nebenwirkungen auftreten (was in Ihrem Beispiel nicht der Fall ist).

Nach Rückkehr von TestIntReturn wird die Funktion den Rückgabewert auf dem Stapel ausgeben, der Aufrufer wird dann den Stapelrahmen entsprechend anpassen, aber den zurückgegebenen Wert nicht vom Stapel in eine Variable kopieren.

    
Timo Geusch 26.02.2013 18:28
quelle
0

Nichts - es geht in den Äther und wird nicht gespeichert / benutzt. Der Rückgabewert selbst ist ein rvalue oder temporär; Ich glaube, der Compiler wird sogar die temporäre Erstellung optimieren, da sie nicht wirklich verwendet wird.

    
Rollie 26.02.2013 18:29
quelle
0

Der Rückgabewert wird auf dem Stapel gespeichert und bei Rückkehr der Funktion gelöscht. Da es vom Aufrufer keiner Variablen zugewiesen wird, wird es einfach verworfen, wenn der Stapel geöffnet wird.

    
SNce 26.02.2013 18:30
quelle
0

Jeder hat richtig geantwortet - der Rückgabewert wird in diesem Fall einfach verworfen und in diesem speziellen Beispiel können Sie ihn ignorieren.

Allerdings , wenn der Rückgabewert ein Zeiger auf Speicher ist, der in der Funktion zugewiesen ist, und Sie ihn ignorieren, haben Sie eine Speicherleck.

So einige Funktion Werte können Sie nicht einfach ignorieren, aber in diesem Fall - Sie können.

    
zmbq 26.02.2013 18:54
quelle
0

Bei primitiven Typen passiert nichts. Es ist einfach ignoriert. Bei Klassenarten das zurückgegebene Objekt wird zerstört werden, ohne dass etwas anderes passiert.

    
James Kanze 26.02.2013 19:34
quelle

Tags und Links