我们知道
register variable
是faster accessible
,并且在创建任何变量compiler
中。
register variable
我只想知道“是否有任何情况/应用程序
我们只需要使用register int val;
“正如我们所知道的” - 实际上,我们知道这一点。
register variable
是编译器的一个sogguggestion,而不是要求。当今的疯狂优化编译器很少需要。从当前(C11)标准:
具有存储级规范寄存器的对象的标识符声明 建议对对象的访问尽可能快。这样的程度 建议是有效的,是实施定义的。
因此,它进入登记册。它也可以进入更快的内存,常规内存,甚至在磁盘上或在蒙古的服务器上,以惩罚编码器使用不必要的关键字:-) 您amay发现在编译器中很有用,
aren't.非常聪明(例如,一些较旧的,嵌入式的东西),但即使如此,您也不会使用它来使用它 - 通常,您应该使用它忘了它。它和
register
一样有用。
例如,以例子为例,让我们假设一个相当“比较优越的”编译器,将每个C指令视为一个单元。这样,我的意思是:
auto
将转换为组件(经典的负载商店体系结构):
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
当然,所有这些东西都取决于编译器及其使用寄存器。我给出的代码只是一个人为的示例。正如我所说,有了现代编译器,这很少是必要的。
Bottom Line,在回答您的特定问题时:“我们是否有任何情况/应用程序在某些情况下仅使用寄存器变量,而其他变量在这种情况下没有用?”,答案是否。如果它确实是C编译器,则无需使用
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
。但是除了它似乎是城市传奇外,register
在C程序中具有语义含义:用
register
而不是register
声明的变量,默认,不能受到register
auto
只是一个优化提示,就像&
有一种情况,不仅值得您提示编译器为变量分配寄存器,还要为其命名特定寄存器(然后不允许忽略
register
关键字):实现有效的螺纹虚拟机。
.。 在您必须混合C和组装代码的任何其他情况下,将C变量手动映射到寄存器都是必不可少的。