Cóż ... jeśli mówiliśmy o całek odpowiedzią byłoby jednoznaczne tak (w ramach ogólnego terminu Stała Folding). Nawet obliczenia długotrwałe mogą być wykonywane w czasie kompilacji ... a tak naprawdę jest to wymagane w przypadku szablonów do oceny parametrów nie typu i zmiennych (teraz) constexpr
.
W przypadku reprezentacji zmiennoprzecinkowych zmiennoprzecinkowe rzeczy stają się nieco skomplikowane, gdy obliczenia stają się nieco bardziej skomplikowane. Problem polega na tym, że reprezentacje zmiennoprzecinkowe o różnych rozmiarach (a tym samym dokładności) przyniosą różne wyniki dla tych samych podstawowych danych wejściowych.
Aby zrozumieć dlaczego, załóżmy, że float
ma co najwyżej 5 cyfr dokładności:
5.0000 + 0.00001
-> 5.00001
-> 5.0000 (truncation to 5 digits)
5.0000 + 0.00001 + ... + 0.00001 (10 times)
-> 5.0000 + 0.00001 + ... + 0.00001 (9 times)
-> 5.0000 + 0.00001 + ... + 0.00001 (8 times)
-> ...
-> 5.0000
Zaskakujące ... prawda? Jeśli kompilacja jest wykonywana w czasie wykonywania, wynik może się różnić w zależności od tego, czy używany jest rejestr (z większą przepustowością), czy nie.
W związku z tym, czy stałe składanie występuje prawdopodobnie zależy od na zestaw flag optymalizacji używasz. Na przykład for gcc, to może być kontrolowane przez -freciprocal-math
(naprawdę nie mam pojęcia). Ponieważ nawet jeśli kompilator z pewnością może zrobić to, możesz powiedzieć, że nie (nieświadomie).
Tak więc jedynym pewnym sposobem na sprawdzenie tego jest sprawdzenie wyjścia kompilatora; albo poprzez sprawdzenie kodu obiektu LUB przez zapytanie kompilatora o emisję zespołu. I musisz sprawdzić to wyjście dla każdej kombinacji opcji, których używasz.
Wystarczy spojrzeć na wyjście asemblera: 'gcc -S' – ydroneaud
GCC -O1 i wyżej na pewno wykona to podczas kompilacji. W rzeczywistości jest więcej kodu w GCC dla tego rodzaju rzeczy, obsługujących również funkcje zdefiniowane przez użytkownika - patrz także constexpr. – dascandy
Tak jak FYI, ta optymalizacja nazywa się [stałe składanie] (http://en.wikipedia.org/wiki/Constant_folding). – unwind