寄存器

向编译器提示访问对象应该尽可能快。编译器是否实际使用提示是实现定义的; 它可能只是将它视为与 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 阵列一起使用。