Volatile superstition

Programmers memory seems to be volatile regarding the meaning of the C or C++ qualifier ‘volatile’. There are at least a dozen of articles on the internet referencing or copying in verbatim Jones Nigel and a zillion discussions on bulletin boards. Yet there is at least as much superstition among even experienced developers.
Section 6.7.2 of ISO C99 defines it simply as: “An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects.”
There is nothing magic about the volatile type qualifier!

  • It is a hint to the compiler not to make any assumptions how to optimize the ‘object’. On every access the value of the object has to be fetched.
  • If a pointer is declared volatile volatile int* ptr it means the content of address ptr “may be modified in ways unknown to the implementation”, for instance a hardware status register.
  • It does not magically make every address with relative offset to ptr volatile! The value at *(ptr+4) is not volatile.
  • It does not synchronize caches, bus access or anything alike
  • It does not prevent instruction level parallelism or re-ordering by processors

End of story.