[C++ / Java] Sprawdzanie warunku w pętli

0

Witam

Mam dwie pętle:

while(i == getValue())
x = getValue()
while(i == x)

Czy ta druga jest szybsza? Czy kompilator stosuje jakieś buforowanie wartości zwróconej przez funkcje, czy za każdym razem przy sprawdzaniu warunku wywołuję tą funkcję? (Przy założeniu, że nie stosuje nigdzie wcześniej modyfikatora const.)

I co w wypadku jeśli zapewnie, że w trakcie wykonywania pętli wartość zwrócona przez funkcję się nie zmieni?
Czy takie rozwiązanie będzie najszybsze, czy nic nie zmieni?:

const x = getValue()
while(i == x)

I jeszcze jestem ciekaw czy pod Javą jest tak samo czy to zupełnie inna bajka.

0

W ogóle nie rozumiem pytania. Skoro wywołanie funkcji jest częścią warunku to siłą rzeczy wywołanie funkcji musi być przy każdym sprawdzeniu wykonane. Funkcje w C++ nie są funkcjami w matematycznym znaczeniu, nawet w wypadku funkcji const nie można zagwarantować stałości wyniku.

0

Chodzi o to, że normalnie dostęp do zmiennej x jest dużo szybszy niż dostęp do wartości zwróconej przez funkcje, która jest załóżmy bardzo skomplikowana.

Jeżeli jednak było by tak, że w pętli tylko raz jest wywoływana funkcja i jej wartość zwrócona jest zapamiętana w zmiennej tymczasowej stworzonej przez kompilator i w kolejnych cyklach jest porównanie i == [zmienna tymczasowa kompilatora] to bez sensu tworzyć wtedy jeszcze zmienną x.

0

Weźmy może na logikę - zróbmy taki kod:

while (i < stack.size()) stack.pop();

Stack::size ma pełne prawo być funkcją const, prawda? Co się stanie jeżeli kompilator spróbuje wywołanie zastąpić wynikiem, jednorazowo?

Nie, kompilator nie ma prawa zastąpić funkcji wynikiem obliczeń jeżeli nie może zagwarantować, że wynik jest stały w danym wypadku. Tak, nie bez powodu wyciąga się granice (najczęściej chyba długość c-stringa) przed pętlę, co jest powszechną praktyką zresztą.

0

jeśli funkcja zwraca zawsze ten sam wynik to lepiej przypisać wynik do zmiennej, jeśli za każdym razem zwraca inny to wydaje mi się, że nie ma znaczenia czy przypiszesz wynik do zmiennej i porownasz z ta zmienną czy porownasz bezposrednio. z tego co mi sie wydaje to kompilator przy porownywaniu wartosci z wynikiem funkcji tworzy zmienną tymczasową i ją porównuje więc na jedno wyjdzie.

0

Faktycznie zapomniałem dopisać, że funkcja na czas działania pętli będzie zwracać ten sam wynik, ale wydawało mi się oczywiste to założenie inaczej tworzenie zmiennej i porównanie jej w pętli jest ogromnym błędem.

Dzięki za odpowiedzi, problem rozwiązany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1