pure/const function attributes in different compilers

Albert picture Albert · May 9, 2010 · Viewed 11.7k times · Source

pure is a function attribute which says that a function does not modify any global memory.
const is a function attribute which says that a function does not read/modify any global memory.

Given that information, the compiler can do some additional optimisations.

Example for 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)); }

In that example, the compiler could optimise the function calculate to:

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;
}

Or if your compiler is clever enough (and not so strict about floats):

float calculate(float x, unsigned int C) { return C ? sigmoid(x) * C : 0.0f; }

How can I mark a function in such way for the different compilers, i.e. GCC, Clang, ICC, MSVC or others?

Answer

Albert picture Albert · May 9, 2010

In general, it seems that almost all compilers support the GCC attributes. MSVC is so far the only compiler which does not support them (and which also doesn't have any alternative).