Атрибуты pure/const в разных компиляторах

чистый - это атрибут функции, который говорит, что функция не изменяет никакой глобальной памяти.
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 или других?

Ответ 1

В целом кажется, что почти все компиляторы поддерживают атрибуты GCC. MSVC пока единственный компилятор, который их не поддерживает (и который также не имеет альтернативы).