为什么我们不能一直使用C中的寄存器存储class?

Why can't we always use the register storage class in C?

我在一本书上看到,每当我们声明一个存储class为寄存器的变量时,它就会被存储在一个寄存器中,这取决于它的可用性。如果没有寄存器可用,则默认存储类型 'auto' 将分配给它。

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

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

编辑:我在网上搜索过,但 'unavailability of the address' 是唯一提到的一点。为什么rest变量不能声明为'register'没有提到。

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

但是,register 限定符在今天的 optimizing compilers like GCC or Clang/LLVM and these compilers will happily and freely use a machine register for variables not qualified register or even keep in memory (not in a machine register) a variable qualified as register. Essentially the compiler is ignoring the register qualifier (except to forbid taking its address). It has complex register allocation 算法和启发式算法中没有任何作用。对于函数代码的某些部分,给定的变量可能会保留在机器寄存器中,而对于其他部分则可能会放在内存中。

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

另请注意 CPU cache is much more important than processor registers today. If you want to hand-tune your C code for performance (which is often a bad idea, since the compiler is doing better than you can), better take care of caching issues (see this).

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

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

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

使用寄存器可能并非完全没有意义的唯一情况是当您有一个看起来比其他变量使用得少得多的变量时,但您知道得更多。即使那样也是很大的"may"。