Monday, May 16, 2011

When should the register modifier be used? Does it really help?


The register modifier hints to the compiler that the variable will be heavily used and should be kept in the
CPU’s registers, if possible, so that it can be accessed faster. There are several restrictions on the use of the
register modifier.
First, the variable must be of a type that can be held in the CPU’s register. This usually means a single value
of a size less than or equal to the size of an integer. Some machines have registers that can hold floating-point
numbers as well.
Second, because the variable might not be stored in memory, its address cannot be taken with the unary &
operator. An attempt to do so is flagged as an error by the compiler.
Some additional rules affect how useful the register modifier is. Because the number of registers is limited,
and because some registers can hold only certain types of data (such as pointers or floating-point numbers),
the number and types of register modifiers that will actually have any effect are dependent on what machine
the program will run on. Any additional register modifiers are silently ignored by the compiler.
Also, in some cases, it might actually be slower to keep a variable in a register because that register then
becomes unavailable for other purposes or because the variable isn’t used enough to justify the overhead of
loading and storing it.
So when should the register modifier be used? The answer is never, with most modern compilers. Early C
compilers did not keep any variables in registers unless directed to do so, and the register modifier was a
valuable addition to the language. C compiler design has advanced to the point, however, where the compiler
will usually make better decisions than the programmer about which variables should be stored in registers.
In fact, many compilers actually ignore the register modifier, which is perfectly legal, because it is only a hint
and not a directive. In the rare event that a program is too slow, and you know that the problem is due to a variable being stored
in memory, you might try adding the register modifier as a last resort, but don’t be surprised if this action
doesn’t change the speed of the program.