“我们知道”——实际上我们不知道。
register 是对编译器的建议,而不是要求。当今疯狂优化的编译器很少需要它。从当前的(C11)标准:
具有存储类说明符寄存器的对象的标识符声明
建议尽可能快地访问对象。这种程度
建议是否有效由实现定义。
所以它可以进入一个寄存器。它还可以进入更快的内存、常规内存甚至是磁盘或内蒙古的服务器,以惩罚编码人员使用不必要的关键字:-)
您可能发现它在不是非常聪明的编译器中很有用(例如,可能是一些较旧的嵌入式编译器),但即便如此,您也不会' t 必须 使用它 - 通常,您应该忘记它。它和auto 一样有用。
作为示例,让我们假设一个相当“优化不足”的编译器将每条 C 指令视为一个单元。我的意思是这样的:
int x = 1;
x = x + 7;
x = x - 2;
useX (x);
将转换为程序集(经典的加载存储架构):
loadi r0, 1 ; set r0 to 1
stor r0, [x] ; store to memory
load r0, [x] ; load from memory
addi r0, 7 ; add 7
stor r0, [x] ; store to memory
load r0, [x] ; load from memory
subi r0, 2 ; subtract 2
stor r0, [x] ; store to memory
load r0, [x] ; load from memory
call useX ; call the function
换句话说,没有优化意识到在添加之后该值仍在r0中,因此无需再次加载它。
在这样一个(脑死的)编译器中,使用register 可能会带来相当方便的效率。代码:
register int x = 1;
x = x + 7;
x = x - 2;
useX (x);
可能会产生更好的代码:
loadi r0, 1 ; set r0 to 1
addi r0, 7 ; add 7
subi r0, 2 ; subtract 2
call useX ; call the function
当然,所有这些都取决于编译器以及它如何使用寄存器。我给出的代码只是一个人为的例子。正如我所说,对于现代编译器,它很少需要。
底线,回答您的具体问题“是否存在我们必须仅使用寄存器变量而其他变量在这种情况下无用的情况/应用?”,答案是否定的.如果是真正的 C 编译器,则不需要使用 register 关键字。