c - 我们必须在哪里只使用寄存器变量?

标签 c variables compiler-construction storage cpu-registers

正如我们所知,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/

相关文章:

compiler-construction - wxwidgets setup.h“没有这样的文件”

c - 为什么我们不应该在 C 中包含源文件

c - 将用户输入的 char 存储为变量时出错

PHP 和 URL 中的 A id?

C# 变量初始化与赋值

variables - 在 zsh 中使用变量作为命令参数

c++ - 未更改的 C++ 文件的目标代码在重新编译时发生更改的可能原因是什么?

c++ - 使用LLVM遍历AST

更改互斥体的优先级

c - 执行 memset 函数时遇到问题?