The pointer optimization you're talking about is possible in C, because of potential pointer aliasing. Say you have the following sequence:
val = [asterix]p1
[asterix]p2 = 1
val = [asterix]p1
p2 might actually point to the same location as p1, so you can't avoid fetching from memory the second time.
IIRC volatile means that a variable cannot be optimized away completely, or moved to a register. This is necessary for memory-mapped architectures when you must access memory to communicate with the hardware (as opposed to storing values).
EDIT: trying to get the asterisks to work in this post...
p2 might actually point to the same location as p1, so you can't avoid fetching from memory the second time.
Not necessarily: if p1 and p2 are of different types (and neither is char * or void *), then the compiler is free to assume that they don't point to the same location. This is called "strict aliasing" per the C99 spec; it breaks a lot of old C code.
val = [asterix]p1
[asterix]p2 = 1
val = [asterix]p1
p2 might actually point to the same location as p1, so you can't avoid fetching from memory the second time.
IIRC volatile means that a variable cannot be optimized away completely, or moved to a register. This is necessary for memory-mapped architectures when you must access memory to communicate with the hardware (as opposed to storing values).
EDIT: trying to get the asterisks to work in this post...