IRS*_*HAD 1 c compiler-construction variables storage cpu-registers
正如我们所知道的register variable
就是faster accessible
,它是于compiler
创建的任何变量register variable
.
register int val;
Run Code Online (Sandbox Code Playgroud)
我只是想知道" 我们必须使用register variable
哪种情况/应用程序,而其他变量在这种情况下没用?"
如果你可以放一段代码,那就明白了.
"我们知道" - 实际上我们不知道.
register
是对编译器的建议,而不是要求.对于当今疯狂优化的编译器来说,它很少需要.从目前的(C11)标准:
具有存储类说明符寄存器的对象的标识符声明表明对对象的访问尽可能快.这些建议有效的程度是实施定义的.
所以它可以进入注册表.它还可以进入更快的内存,常规内存甚至磁盘上,或内蒙古的服务器上,以惩罚编码人员使用不必要的关键字:-)
你可能会发现它在编译器有用的都没有这么聪明(或许有些老,嵌入式的,例如),但即使,那么,你不具备使用它-通常,你应该忘掉它.它和它一样有用auto
.
举例来说,让我们假设一个相当"低于优化"的编译器将每个C指令视为一个单元.那个,我的意思是:
int x = 1;
x = x + 7;
x = x - 2;
useX (x);
Run Code Online (Sandbox Code Playgroud)
将被转换为程序集(经典的加载存储架构):
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
Run Code Online (Sandbox Code Playgroud)
换句话说,没有优化意识到该值仍然在添加r0
之后,因此不需要再次加载它.
在这样的(脑死亡)编译器中,使用register
可以提供非常方便的效率.代码:
register int x = 1;
x = x + 7;
x = x - 2;
useX (x);
Run Code Online (Sandbox Code Playgroud)
可能会产生更好的代码:
loadi r0, 1 ; set r0 to 1
addi r0, 7 ; add 7
subi r0, 2 ; subtract 2
call useX ; call the function
Run Code Online (Sandbox Code Playgroud)
当然,所有这些都取决于编译器以及它如何使用寄存器.我给出的代码只是一个人为的例子.正如我所说,使用现代编译器,它很少是必要的.
最重要的是,在回答您的具体问题时"是否有任何情况/应用我们必须只使用寄存器变量和其他变量对这种情况没用?",答案是否定的.如果它真的是一个C编译器,则不需要使用该register
关键字.