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:
- You cannot use pointers to reference objects that
have the
register
storage class specifier. - You cannot use the
register
storage class specifier when declaring objects in global scope. - A register does not have an address. Therefore,
you cannot apply the address operator (
&
) to aregister
variable. - You cannot use the
register
storage class specifier when declaring objects in namespace scope.
register
storage
class. For example: register int i;
int* b = &i; // valid in C++, but not in C
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, a
new object is allocated 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.
Variables in specified registers (C only) (IBM extension)
When the GENASM compiler option is in
effect, you can specify that a particular hardware register is dedicated
to a global variable by using an asm
register
variable declaration. Global register variables reserve registers
throughout the program; stores into the reserved register are never
deleted. The register variable must be of type pointer.
Register variable declaration syntax
- r0 to r15 or R0 to R15
- General purpose registers
- Registers can only be reserved for variables of pointer type.
- A global register variable cannot be initialized.
- The register dedicated for a global register variable should not be a volatile register, or the value stored into the global variable might not be preserved across a function call.
- More than one register variable can reserve the same register; however, the two variables become aliases of each other, and this is diagnosed with a warning.
- The same global register variable cannot reserve more than one register.
register
storage
class specifier is deprecated in C++11.