чистый - это атрибут функции, который говорит, что функция не изменяет никакой глобальной памяти.
const - это атрибут функции, который говорит, что функция не читает/не изменяет любую глобальную память.
Учитывая эту информацию, компилятор может сделать некоторые дополнительные оптимизации.
Пример для GCC:
float sigmoid(float x) __attribute__ ((const));
float calculate(float x, unsigned int C) {
float sum = 0;
for(unsigned int i = 0; i < C; ++i)
sum += sigmoid(x);
return sum;
}
float sigmoid(float x) { return 1.0f / (1.0f - exp(-x)); }
В этом примере компилятор может оптимизировать функцию для вычисления:
float calculate(float x, unsigned int C) {
float sum = 0;
float temp = C ? sigmoid(x) : 0.0f;
for(unsigned int i = 0; i < C; ++i)
sum += temp;
return sum;
}
Или, если ваш компилятор достаточно умный (и не очень строгий по плаванию):
float calculate(float x, unsigned int C) { return C ? sigmoid(x) * C : 0.0f; }
Как я могу пометить функцию таким образом для разных компиляторов, т.е. GCC, Clang, ICC, MSVC или других?