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

Sup*_*ing 11 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;
}
Run Code Online (Sandbox Code Playgroud)

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

谁可以给我解释一下这个?谢谢.

dsi*_*cha 16

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

  • 当关闭优化时,它会对gcc产生影响(参考:http://gcc.gnu.org/onlinedocs/gcc/Hints-implementation.html). (4认同)
  • 我听过很多地方都忽略了这面旗帜,但除了谣言外,我从来没有见过任何支持这一点的事情.你碰巧有消息来源吗?根据我对gcc的经验,这个标志有时会产生影响(虽然我承认差异通常是负面的). (2认同)
  • 虽然有人会想知道为什么你在没有优化的情况下编译时会尝试用`register`来"优化". (2认同)

Soa*_*Box 13

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

这只是一个提示,编译器不必采取它.

  • 通过地址传递`register`变量只是告诉编译器将其溢出到堆栈.它在C++中非常合法(但不是ANSI C). (2认同)

Die*_*ano 6

在gcc中,寄存器绝对不会被忽略,除非你指定了优化选项。用这样的东西测试你的代码

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您获得(取决于 REG 是否已定义或为空)

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

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

  • 在什么优化级别会被忽略? (2认同)