Compiler May Optimize Memory Access Away
If you have some code that looks like this:
int* ptr_a = some_extern_function();
*ptr_a = 1;
*ptr_a = 2;
The compiler will remove *ptr_a = 1;
because it only respects the final state of memory. That’s why you need volatile
of writing to memory triggers I/O.
Reading from memory will be optimized away by the same logic. If the result isn’t used anywhere, the read doesn’t have to happen.