3

我在一本书中读到,每当我们使用存储类作为寄存器声明一个变量时,它将被存储在一个寄存器中,这取决于它的可用性。如果没有可用的寄存器,则将为其分配默认存储类型“auto”。

每当我们声明一个变量而没有明确提及任何存储类时,分配给它的默认存储类型就是“auto”本身。

所以,我的问题是,为什么不将每个变量都声明为“寄存器”存储类 - 如果没有可用的寄存器,它无论如何都会被视为默认的“自动”类本身。幸运的是,如果寄存器可用,那么它将被存储在一个中。我知道我们不能再使用 & 运算符,但是如果我打算使用指针和地址怎么办?那么我可以用“注册”存储类声明这些变量吗?因为这似乎是一种不好的做法。

编辑:我在网上搜索,但“地址不可用”是唯一提到的一点。没有提到为什么不能用 'register' 声明其余变量。

4

2 回答 2

6

您不能制作所有变量register,因为 C(和(C++)语言规范明确禁止获取register变量的地址。

但是,限定符register在当今的优化编译器(如GCCClang/LLVM )中没有任何作用,这些编译器将愉快且自由地为未限定的变量使用机器寄存器,register甚至将限定为的变量保存在内存中(不在机器寄存器中)register. 本质上,编译器忽略register限定符(除了禁止获取其地址)。它具有复杂的寄存器分配算法和启发式方法。对于函数代码的某些部分,给定的变量可能会保留在机器寄存器中,而对于其他部分,则可能会被放入内存中。

从优化的角度来看,当前的编译器以相同的方式处理autoregister限定变量(因此register限定符是无用的,除了禁止地址操作符)。

还要注意CPU 缓存比今天的处理器寄存器重要得多。如果您想手动调整您的 C 代码以提高性能(这通常是一个坏主意,因为编译器比您做得更好),请更好地处理缓存问题(请参阅this)。

AFAIK,C 和 C++ 语言的未来版本将正式弃用register限定符(就像他们对auto限定符所做的那样),并且将来的语言规范可能会将该关键字重用于其他目的(如 C++11 重用auto)。所以在你的源代码中使用register可能是一个错误,因为它可能会使你的代码更难移植到 C 或 C++ 的未来版本。

于 2015-06-14T04:59:34.300 回答
3

“register”关键字只是对编译器的一个提示,即如果可能的话,认为应该比其他变量更快地处理该变量。作为副作用,不允许获取变量的地址,并且寄存器数组是未定义的行为。

任何现代编译器都会尽可能多地使用寄存器,所以不再需要这个关键字。编译器也比你聪明:它可以在程序的一部分中为变量 x 使用寄存器,在程序的另一部分中为变量 y 使用寄存器。或者对结构的五个字段中的两个使用寄存器。所有你甚至不能用 register 关键字表达的东西。

使用寄存器可能并非完全没有意义的唯一情况是当您有一个变量看起来比其他变量使用得少得多,但您知道得更好。即便如此,这也是一个很大的“可能”。

于 2015-06-14T05:25:19.133 回答