首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我应该在现代C程序中使用寄存器类变量吗?

我应该在现代C程序中使用寄存器类变量吗?
EN

Stack Overflow用户
提问于 2020-01-07 18:23:39
回答 4查看 266关注 0票数 1

在C++中,关键字register在其最新标准ISO/IEC 14882:2017 (C++17)中被删除。

但在C中,我也看到了很多,越来越多的编码器倾向于不使用或喜欢使用register类限定符来声明对象,因为它的目的优势几乎毫无用处,就像在@user253751´s answer中那样:

register不会导致编译器将值存储在寄存器中。register绝对什么都不做。只有非常老的编译器才使用register来知道要在寄存器中存储哪些变量。新编译器自动完成此操作。即使是20岁的编译器也会自动这么做。

  • 是使用register类变量,而在使用关键字register时,我在现代程序中使用了register类变量?或者这种行为是多余的和不推荐的?
EN

回答 4

Stack Overflow用户

发布于 2020-01-07 18:30:34

使用register没有好处。现代编译器基本上忽略了它--它们可以比您更好地处理寄存器分配。它唯一阻止的是获取变量的地址,这不是一个显著的好处。

我自己的代码都不再使用register了。当我处理一个文件时,我处理的代码会丢失register --但是要通过17,000+文件需要时间(而且我只在有外部原因更改它时才更改它--但它可能是一个脆弱的原因)。

票数 5
EN

Stack Overflow用户

发布于 2020-01-07 18:50:03

正如@JonathanLeffler所说,它在大多数情况下都被忽略了。

如果希望将变量保存在特定的寄存器中,某些编译器具有特殊的扩展语法。

gcc全局变量或局部变量可以放在特定的寄存器中。此选项并不适用于所有平台。我知道AVR和ARM端口实现了它。

示例:

代码语言:javascript
复制
register int x asm ("10");

int foo(int y)
{
    x = bar(x);
    x = bar1(x);
    return x*x;
}

https://godbolt.org/z/qwAZ8x

更多信息:https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/Explicit-Register-Variables.html#Explicit-Register-Variables

但老实说,我从来没有在编程生活中使用过它(30y+)

票数 3
EN

Stack Overflow用户

发布于 2020-01-07 19:32:25

它实际上是不受欢迎的,也没有真正的好处。

C是20世纪70年代早期的产物,register关键字向编译器提供了一个提示:( a)这个特定的对象将被大量使用,所以b)您可能希望将它存储在主存以外的其他地方- IOW、寄存器或其他“快速”内存。

这可能在当时起到了很大的作用--现在,它几乎被忽视了。唯一可测量的效果是,它阻止您获取该对象的地址。

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

https://stackoverflow.com/questions/59634042

复制
相关文章

相似问题

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