正如我们所知,register variable
访问速度更快
,编译器
可以创建register variable<的任何变量
.
register int val;
我只想知道“是否有任何情况/应用程序我们必须只使用注册变量
而其他变量没有用在这种情况下?”
如果能贴一段代码就好理解了。
最佳答案
“据我们所知”- 实际上我们不知道。
register
是对编译器的建议,而不是要求。今天疯狂优化的编译器很少需要它。来自当前 (C11) 标准:
A declaration of an identifier for an object with storage-class specifier register suggests that access to the object be as fast as possible. The extent to which such suggestions are effective is implementation-defined.
所以它可以进入寄存器。它还可以进入更快的内存、常规内存甚至磁盘或内蒙古的服务器上,以惩罚使用不必要关键字的编码人员:-)
您可能发现它在编译器中很有用,但不是非常聪明(例如,可能是一些较旧的嵌入式编译器),但即便如此,您也不会必须 使用它 - 通常,您应该忘记它。它与 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
关键字。
关于c - 我们必须在哪里只使用寄存器变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22060519/