c语言 – C中的“register”关键字?

什么是register关键字在C语言吗?我已经读过它用于优化,但在任何标准中都没有明确定义。它仍然是相关的,如果是的话,你什么时候使用它?


这是编译器的一个提示,即变量将被大量使用,如果可能,建议将其保存在处理器寄存器中。

大多数现代编译器会自动执行此操作,并且比我们人类更善于选择它们。


令我感到惊讶的是,没有人提到你不能获取寄存器变量的地址,即使编译器决定将变量保存在内存而不是寄存器中。

因此,使用register你什么都不赢(无论如何编译器将决定在哪里放置变量)并失去&操作员 – 没有理由使用它。


它告诉编译器尝试使用CPU寄存器而不是RAM来存储变量。寄存器位于CPU中,访问速度比RAM快得多。但这只是对编译器的一个建议,它可能无法完成。


我知道这个问题是关于C的,但是关于C ++的同一个问题被完全复制了。因此,这个答案可能不适用于C.


最新的C ++ 11标准草案N3485在7.1.1 / 3中说明了这一点:

一个register说明符是一种提示,如此声明的变量将被频繁使用的实现。[ 注意:提示可以忽略,在大多数实现中,如果采用变量的地址,它将被忽略。这个用法已被弃用… -end note ]

在C ++中(但不是在C中),标准并未声明您不能获取声明的变量的地址register; 但是,因为存储在CPU寄存器中的变量在其整个生命周期中没有与之关联的存储单元,所以尝试获取其地址将无效,并且编译器将忽略该register关键字以允许获取该地址。


至少15年来,由于优化者对此做出了比这更好的决策,因此无关紧要。即使它是相关的,它在具有许多寄存器的CPU架构上更有意义,例如SPARC或M68000,而不是因为缺少寄存器的英特尔,其中大部分是由编译器为其自身目的保留的。


实际上,register告诉编译器该变量不与程序中的任何其他内容(甚至不是char)进行别名。

现代编译器可以在各种情况下利用它,并且可以在复杂的代码中帮助编译器 – 在简单的代码中,编译器可以自己解决这个问题。

否则,它没有用处,也不用于寄存器分配。只要编译器足够现代,它通常不会导致性能降低。

添加评论

友情链接:蝴蝶教程