2010-09-30 69 views
2

因为我知道在C中我们可以使用关键字“register”来向编译器建议变量应该存储在CPU寄存器中。涉及CPU指令的所有变量最终都将存储在CPU寄存器中以便执行,这是不是真的?为什么我们需要建议一个变量存储在寄存器中?

+0

这个相关的问题可能会有帮助:[“在C中注册关键字?](http://stackoverflow.com/questions/578202/register-keyword-in-c) – 2010-09-30 07:46:59

回答

5

register关键字是一种告诉编译器该变量被大量使用的方式。确实,通常必须将值暂时加载到寄存器中以对其执行计算。这个名字来源于这样一种想法,即编译器可能会将变量保存在寄存器中的整个持续时间范围内,而不是只在临时用于计算时。

由于现代编译器可以在程序员没有帮助的情况下确定何时大量使用变量(以及何时不使用其地址),因此该关键字已过时用于优化。

+0

如何确定范围的“持续时间”? C中的块? – woongiap 2010-09-30 07:54:36

+0

编译器确定您的持续时间 - 优化后可能少于或多于源代码块/范围。如果该值未在范围的后半部分使用,并且内存/寄存器可以有效地用于其他内容,则更少;如果该值以某种方式返回到当前块之外,并且出于效率原因应该保持活动状态当前范围。 – 2010-09-30 08:06:21

+0

-1:关键字不会过时。不幸的是,现在它与目标机器的寄存器没有多大关系,但唯一的含义是你不能获取该变量的地址。这可以是一个宝贵的优化提示,并且在安全性方面也很重要。它阻碍了你无意中暴露了堆栈变量的地址。 – 2010-09-30 08:30:50

1

在过去,编译器并不像现在这样聪明。这是编程人员向编译器提示的,该变量应存储在寄存器中,以便快速访问/修改。今天,几乎所有体面的编译器都实现了聪明的寄存器分配算法,它们击败了人类的头脑。

4

您应该不是使用register关键字。这是一个古老的遗物,保持向后兼容性。大多数编译器都会忽略它(默认情况下)。

可能有例外,但它们非常罕见,请查阅您的编译器手册。

是不是所有涉及CPU指令的变量最终都会存储在CPU寄存器中执行?

是的,的确如此。但是CPU寄存器是有限的,所以变量通常从'普通'存储器加载/存储,并且只是简单地存在于寄存器中。 register关键字是(是)指示应该占用更长寄存器的高优先级变量的一种方式。像for(i = 0; ...)中的i一样。

+3

只是因为我不应该使用它'我不应该问这个问题 – woongiap 2010-09-30 07:56:42

+0

@woong:你绝对是对的。但是我的回答从关于“注册”的最重要的事情开始。 – 2010-09-30 08:04:34

+0

@亨克:谢谢,我只是对在手册上阅读它的定义感到好奇,我不会使用它,到目前为止您认为哪个答案最好? – woongiap 2010-09-30 08:09:49

1

大多数变量将加载进入寄存器很短的时间...只要有必要做什么需要与他们做什么。 register关键字暗示他们应该在那里保留

虽然编译器的优化已经变得非常好,但register关键字并不是很有帮助。事实上,如果你的编译器根本不尊重它(甚至不这样做),它甚至会让你感到困惑(通过捆绑编译器的手,使某些优化成为不可能)。所以现在这是一个非常糟糕的主意。

+0

感谢您的回答,只是caf是第一个提供正确答案的人 – woongiap 2010-09-30 08:22:22

相关问题