The volatile Keyword
Get a detailed introduction to the 'volatile' keyword.
We'll cover the following
Proposal
The abstract in the proposal P1152R0 gives a short description of the changes that volatile undergoes:
“The proposed deprecation preserves the useful parts of volatile and removes the dubious / already broken ones. This paper aims at breaking at compile-time code which is today subtly broken at run time or through a compiler update.”
Before I dive into volatile
, I want to answer the crucial question: When should you use volatile
? A note from the C++ standard says that “volatile is a hint to the implementation to avoid aggressive optimization involving the object because the value of the object might be changed by means undetectable by an implementation.”
This means that for a single thread of execution, the compiler must perform load or store operations in the executable as often as they occur in the source code. volatile
operations, therefore, cannot be eliminated or reordered. Consequently, you can use volatile
objects for communication with a signal handler but not for communication with another thread of execution.
Deprecated features
Now, I want to talk about the deprecated features:
-
Deprecate
volatile
compound assignment, and pre/post increment/decrement -
Deprecate
volatile
qualification of function parameters or return types -
Deprecate
volatile
qualifiers in a structured binding declaration
If you want to know all the sophisticated details, I strongly suggest you watch the CppCon 2019 talk “Deprecating volatile” from JF Bastien. Here are a few examples from his talk.
Additionally, I fixed a few typos in the source code. The numbers in the bullets refer to the three deprecations listed earlier.
- 1:
int neck, tail; volatile int brachiosaur; brachiosaur = neck; // OK, a volatile store tail = brachiosaur; // OK, a volatile load // deprecated: does this access brachiosaur once or twice tail = brachiosaur = neck; // deprecated: does this access brachiosaur once or twice brachiosaur += neck; // OK, a volatile load, an addition, a volatile store brachiosaur = brachiosaur + neck;
Get hands-on with 1400+ tech skills courses.