首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C中什么时候使用寄存器?

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

Stack Overflow用户
提问于 2010-01-15 08:54:33
回答 6查看 11.8K关注 0票数 11

我有这样的东西

代码语言:javascript
运行
复制
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之前添加寄存器时,它实际上运行得比现在慢,但比不使用寄存器时要快。

有人能给我解释一下吗?谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-01-15 08:58:50

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

不过,这只是一个提示,编译器不需要理解它。

票数 13
EN

Stack Overflow用户

发布于 2010-01-15 08:59:03

你是怎么计时的?实际上,register通常什么也不做。这是在编译器技术非常原始,编译器自己无法确定寄存器分配时留下的一块残留物。它被认为是为该变量分配一个寄存器的提示,并且对于经常使用的变量很有用。如今,大多数编译器简单地忽略它,并根据自己的算法分配寄存器。

票数 18
EN

Stack Overflow用户

发布于 2010-01-15 09:57:38

在gcc中,register绝对不会被忽略,除非您指定优化选项。使用如下代码测试您的代码

代码语言:javascript
运行
复制
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是定义的还是空的)

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2068721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档