[C++] if'y i operatory logiczne - optymalizacja kodu

0

Co jest lepsze?

val - testowana wartość
p_left - lewa (dolna) granica przedziału
p_right - prawa (górna) granica przedziału
type - flaga bitowa do oznaczenia czy przedział jest domknięty/otwarty
LCLSD - typ enum, wartość 1 - jeśli flaga jest ustawiona, to przedział jest lewostronnie domknięty
RCLSD - typ enum, wartość 2 - jeśli flaga jest ustawiona, to przedział jest prawostronnie domknięty
if (val > p_left) {
        if (val < p_right) return true;
        else if (val == p_right && type & RCLSD) return true;
        else return false;
}
else if (val == p_left && type & LCLSD) return true;
else return false;

czy może

return (val > p_left && (val < p_right || (val == p_right && type & RCLSD)))  ||
       (val == p_left && type & LCLSD);

Obydwa fragmenty robią dokładnie to samo. Jest to fragment klasy metody szblonu klasy interval (przedział) która ma sprawdzać czy dana liczba się w nim znajduje. Przedział ma dawać możliwość ustalenia typu (np. otwarty, lewostronnie domknięty, domknięty).

Pierwszy kod jest znacznie czytelniejszy, lecz powtarzam po kilka razy instrukcje return true i return false. Pytanie brzmi czy jest jakaś różnica w wydajności? Domyślam się, że kompilator powinien ten pierwszy kod zoptymalizować, ale czy warto na nim polegać? Choć ta klasa nie będzie miała w moim programie jakiegoś krytycznego znaczenia, więc jej wydajność nie musi być doskonała, lecz jestem pewien, że w przyszłości natknę się na podobne problemy dotyczące znacznie ważniejszych elementów programu...

0

Takie pytanie czym jest val? Jeśli to jest zwykła liczba int lub double (itp), to po prostu przekombinowałeś z tym domknięciem przedziału. Pamiętaj, że liczby w komputerze nie mają nieskocznej dokładności, więc definiowanie domknięcia przedziału dla tego typu danych nie ma sensu - wystarczy po prostu dodać jakieś epsilon (lub nie) i tyle.

Inna sprawa, czy uważasz to za zabawne:

if(x) 
    return true;
else
    return false;

Ja wolę:

return x;
0

val może mieć różny typ, gdyż jest to interval jest szablonem klasy. Zamierzam stworzyć odpowiednie klasy do przechowywania dokładnych wartości liczb typu 1/3 czy sqrt(2). Użyty zostanie w pisanym przeze mnie programie matematycznym :) Co do drugiej części - rzeczywiście, nie mam pojęcia jak mogłem o tym nie pomyśleć - już zmieniam.

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