寄存器
向编译器提示访问对象应该尽可能快。编译器是否实际使用提示是实现定义的; 它可能只是将它视为与 auto
相同。
对于使用 register
声明的所有对象,唯一明确不同的属性是它们不能计算其地址。因此,register
可以成为确保某些优化的好工具:
register size_t size = 467;
是一个永远不能别名的对象,因为没有代码可以将其地址传递给另一个可能意外更改的函数。
此属性还暗示了一个数组
register int array[5];
不能衰变成指向其第一个元素的指针(即 array
变成 &array[0]
)。这意味着无法访问此类数组的元素,并且无法将数组本身传递给函数。
事实上,使用 register
存储类声明的数组的唯一合法用法是 sizeof
运算符; 任何其他运算符都需要数组的第一个元素的地址。出于这个原因,数组通常不应该使用 register
关键字声明,因为它使得除了整个数组的大小计算之外的其他任何东西都没用,这可以在没有 register
关键字的情况下轻松完成。
register
存储类更适合于在块内定义并以高频率访问的变量。例如,
/* prints the sum of the first 5 integers*/
/* code assumed to be part of a function body*/
{
register int k, sum;
for(k = 1, sum = 0; k < 6; sum += k, k++);
printf("\t%d\n",sum);
}
Version >= C11
_Alignof
算子也允许与 register
阵列一起使用。