Say miałem ten fragment kodu:Czy kompilatory automatycznie optymalizują powtarzające się połączenia z funkcjami matematycznymi?
#include <cmath>
// ...
float f = rand();
std::cout << sin(f) << " " << sin(f);
Jak sin(f)
jest dobrze określoną funkcję nie jest łatwym optymalizacja:
float f = rand();
float sin_f = sin(f);
std::cout << sin_f << " " << sin_f;
Czy to optymalizacja, że to rozsądne, aby oczekiwać nowoczesny kompilator C++ zrobić sam? Czy też nie ma sposobu, aby kompilator ustalił, że sin(f)
powinien zawsze zwracać tę samą wartość dla równej wartości f
?
O ile "sin" nie jest zdefiniowany w tej samej jednostce kompilacji, kompilator nie wie, w jaki sposób "grzech" jest zaimplementowany, więc w najlepszym przypadku stanie się to w czasie połączenia. – Thomas
@Thomas Niekoniecznie. Kilka kompilatorów traktuje funkcje niektórych nazw specjalnie, ponieważ wiedzą, że są zdefiniowane w standardowej bibliotece, a standard gwarantuje coś na ich temat. Istnieją również specyficzne dla kompilatora atrybuty funkcji, które zdefiniowane przez użytkownika nagłówki mogą używać do deklarowania siebie jako czystych, chociaż nie wiem, czy ta wiedza służy do optymalizacji. – delnan
Optymalizacja rzeczywiście odbywa się za pomocą gcc. –