Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pure/const function attributes in different compilers

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?

like image 887
Albert Avatar asked May 09 '10 15:05

Albert


1 Answers

  • GCC: pure/const function attributes
  • llvm-gcc: supports the GCC pure/const attributes
  • Clang: seems to support it (I tried on a simple example with the GCC style attributes and it worked.)
  • ICC: seems to adopt the GCC attributes (Sorry, only a forum post.)
  • MSVC: Seems not to support it. (discussion)

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).

like image 141
Albert Avatar answered Sep 25 '22 06:09

Albert