чистый - это атрибут функции, который говорит о том, что функция не модифицирует глобальную память.
const - это атрибут функции, который гласит, что функция не считывает и не изменяет какую-либо глобальную память.атрибуты функции pure/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; }
Как я могу отметить fu таким образом, для разных компиляторов, т. е. GCC, Clang, ICC, MSVC или других?
Для тех из нас, кто не использует gcc на регулярной основе, возможно, вы можете опубликовать объяснение того, что такое атрибут pure/const. Если это какая-то оптимизация, полезен пример кода C или C++, для которого он помогает компилятору генерировать более оптимальную сборку. –
Я не автор компилятора, но мне кажется, что такой атрибут был бы лишним, если бы определение функции 'sigmoid()' было доступно компилятору * перед * анализом 'calculate()' в той же самой единицы перевода. Несмотря на это, эти атрибуты могут быть полезны, когда определения функций находятся в разных единицах перевода. – Void
Да, GCC (и другие компиляторы) автоматически автоматически добавляет этот атрибут именно в этом случае. А затем, основываясь на атрибуте, они могут делать дальнейшие оптимизации (как в моем примере).И вы точно удалили одну из основных причин для ее указания явно: если компилятор не видит определения в этой точке или если определение не доступно вообще или если вы считаете, что это безопасно, если компилятор уменьшает количество вызывает функцию. – Albert