什么时候在C中使用寄存器?

时间:2010-01-15 00:54:33

标签: c cpu-registers

我有类似的东西

register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}

它做什么,没关系。代码以现在的方式快速运行,如果删除了register关键字,则代码更慢。但是,当我在int n之前添加寄存器时,它实际上比现在运行得慢,但比没有使用寄存器时更快。

有人可以向我解释一下吗?感谢。

6 个答案:

答案 0 :(得分:16)

你是怎么计时的?在实践中,register通常什么都不做。当编译器技术非常原始并且编译器无法自己计算出寄存器分配时,这是一个很大的问题。它应该是一个为该变量分配寄存器的提示,对于非常频繁使用的变量很有用。如今,大多数编译器都会忽略它并根据自己的算法分配寄存器。

答案 1 :(得分:13)

register为编译器提供了一个提示,可以将变量放在寄存器中而不是内存/堆栈空间中。在某些情况下,对于放置此关键字的每个变量,都没有足够的寄存器,因此将其放在太多变量上会导致其他一些变量再次出现。

这只是一个提示,编译器不必采用它。

答案 2 :(得分:4)

在gcc中,除非指定优化选项,否则绝对不会忽略register。 使用类似的东西测试您的代码

unsigned int array[10];

int n;

#define REG register

int main()
{
    REG unsigned int a, b, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

您获得(取决于REG是定义还是空)

diff http://picasaweb.google.com/lh/photo/v2hBpl6D-soIdBXUOmAeMw?feat=directlink

左侧显示使用寄存器的结果。

答案 3 :(得分:1)

可用的寄存器数量有限,因此将所有内容标记为寄存器不会将所有内容都放在寄存器中。基准测试是了解它是否会有所帮助的唯一方法。一个好的编译器应该能够找出自己放入寄存器的变量,因此在决定寄存器关键字有用之前,你应该更多地进行基准测试。

答案 4 :(得分:0)

使用寄存器的想法是,您的变量经常使用。如果您的变量有任何操作,无论如何它将被复制到寄存器中。因此,计数器(索引变量)是此修饰符的候选项。在10年1月15日下午1:57的的示例中,我会这样写:

unsigned int array[10];    

int main()
{
    register int n;
    unsigned int a = 1, b = 2, c;

    for (n = 0; n < 10; ++n){
        c = a + b;
        b = a;
        a = c;
        array[n] = c;
    }
}

答案 5 :(得分:-1)

可分配寄存器有限制。如果你放弃它,你最终会得到效率较低的代码。

我的看法是,如果你做的事情非常重要,你必须自己决定寄存器中的内容以及什么不能,你应该使用汇编语言来编写它。

对于通用语言,我坚信编译器能够更好地决定寄存器中的内容而不是人类。证据是,虽然您不确定可以在寄存器中放入多少变量,但您的编译器肯定知道。