Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

void funkcja(???) - jak to zrobić?

Ostatnio zmodyfikowano 2010-04-03 19:42
Autor Wiadomość
Elaine
» 2010-04-03 19:42:30
mam wrażenie, że funkcja zonk typu void nie będzie pożerała dużo więcej zasobów (pamięć i czas procesora) niż funkcja z "return" (ze zwracaniem wartości)
Dużo więcej faktycznie nie, ale 'trochę więcej' wystarczy, żeby zwracać tak, jak bozia przykazała. Nie bez powodu 'zwracanie' przez referencję stosuje zazwyczaj się tylko tam, gdzie trzeba zwrócić więcej wartości.

Korzyści byłyby jeszcze bardziej widoczne w  przypadku 2(lub więcej) zmiennych wyjściowych [kod ciachnięty]
Można zwrócić pair<double, double> ;>


Jeśliby zrobić to, o czym piszesz (czyli funkcje nie zwracają wartości i wszystkie argumenty są referencjami), to byłoby parę problemów. Po pierwsze, wywołanie funkcji przestałoby być wyrażeniem[1], więc nie dałoby się zrobić czegoś typu "a = f() * 2". Po drugie, byłby niezły kłopot z przekazaniem wartości tymczasowej do funkcji - musielibyśmy się pożegnać z możliwością zrobienia "f(x * 2)" (jest const ref, ale...). I po trzecie - kompilator musiałby być bardzo mocny w optymalizacjach, żeby to działało szybko. Przekazywanie referencji wymaga, aby zmienna miała adres (bo 99.9999% kompilatorów implementuje referencję jako wskaźnik). Przekazanie wartości nic takiego nie wymaga, wartość może sobie siedzieć w rejestrze i też będzie dobrze. Jeśli wszystko byłoby przekazywane jako referencje, to kompilator musiałby sprawdzić, gdzie jest potrzebna sama wartość, a gdzie 'cała zmienna'. Owszem - da się to zrobić, ale będzie to masakrycznie wolne, a wynikowy kod ciągle pozostawiałby wiele do życzenia.

I jeszcze jedno - zwracanie przez return jest bardziej naturalne i żyje w zgodzie z metematyczną definicją funkcji. Powinno się używać właśnie tego, chyba, że ma się naprawdę porządny powód, aby 'zwrócić' coś przez referencję. Amen.

1. Ściśle mówiąc to wciąż by nim było, ale teraz typu void, co komu po takim wyrażeniu?
P-15772
1 2 « 3 »
Poprzednia strona Strona 3 z 3