The register storage class specifier

The register storage class specifier indicates to the compiler that the object should be stored in a machine register. The register storage class specifier is typically specified for heavily used variables, such as a loop control variable, in the hopes of enhancing performance by minimizing access time. However, the compiler is not required to honor this request. Because of the limited size and number of registers available on most systems, few variables can actually be put in registers. If the compiler does not allocate a machine register for a register object, the object is treated as having the storage class specifier auto.

An object having the register storage class specifier must be defined within a block or declared as a parameter to a function.

The following restrictions apply to the register storage class specifier:

C++ only

Unlike C, C++ lets you take the address of an object with the register storage class. For example:

   register int i;
   int* b = &i;      // valid in C++, but not in C
End of C++ only

Storage duration of register variables

Objects with the register storage class specifier have automatic storage duration. Each time a block is entered, storage for register objects defined in that block is made available. When the block is exited, the objects are no longer available for use.

If a register object is defined within a function that is recursively invoked, memory is allocated for the variable at each invocation of the block.

Linkage of register variables

Since a register object is treated as the equivalent to an object of the auto storage class, it has no linkage.

Related information

IBM extension

Global variables in specified registers (C only)

You can specify that a particular hardware register is dedicated to a global variable by using an assembly global register variable declaration. Stores into the reserved register are never deleted. This language extension is provided for compatibility with GNU C.

Read syntax diagramSkip visual syntax diagramGlobal register variable declaration syntax
 
>>-register--variable_declaration------------------------------->
 
>--+-asm-----+-("register_specifier")--------------------------><
   +-__asm__-+
   '-__asm---'
 

The register_specifier is a string representing a hardware register. The register name is CPU-specific. XL C supports the following register names on the PowerPC:

The following are the rules of use for register variables:

Related information

End of IBM extension