1

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

但在 C 语言中,我看到很多,越来越多的编码人员倾向于不使用或不喜欢使用register类限定符声明一个对象,因为它的预期好处几乎是无用的,就像在@user253751 的回答中一样:

register不会导致编译器将值存储在寄存器中。register绝对什么都不做。只有极其古老的编译器register才会知道哪些变量要存储在寄存器中。新的编译器会自动完成。即使是有 20 年历史的编译器也会自动完成。

  • register类变量的使用以及关键字的使用register是否已弃用?

  • 我应该register在我的现代程序中使用类变量吗?或者这种行为是多余的和已弃用的?

4

4 回答 4

5

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

我自己的代码都不再使用register了。当我开始处理文件时,我处理的代码会丢失register- 但需要时间来处理 17,000 多个文件(而且我只在有外部原因更改文件时才更改文件 - 但这可能是一个站不住脚的原因) .

于 2020-01-07T18:30:34.383 回答
3

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

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

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

例子:

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

但老实说,我在编程生涯中从未使用过它(30 岁以上)

于 2020-01-07T18:50:03.330 回答
1

它已被有效地弃用,并没有提供真正的好处。

C 是 1970 年代初期的产品,该register关键字向编译器提示:a)这个特定对象将被大量使用,因此 b)您可能希望将其存储在主内存以外的其他地方 - IOW,寄存器或其他一些“快速”存储器。

那时它可能有所作为——现在,它几乎被忽略了。唯一可衡量的效果是它会阻止您获取该对象的地址。

于 2020-01-07T19:32:25.400 回答
1

首先,不推荐使用此功能,因为:在此上下文中的“注册”(全局或本地寄存器变量)是不推荐使用的 GNU 扩展。

在您的示例中,R10(或 GCC 内部分配 REGNO(reg) = 10 的寄存器)是一个全局寄存器。这里的“全局”意味着您的应用程序中的所有代码都必须同意该用法。来自 libc、libm 或 libgcc 等库的代码通常不是这种情况,因为它们不是使用 -fixed-10 编译的。此外,全局寄存器可能与 ABI 冲突。例如,avr-gcc 可能会在 R10 中传递值。在 avr-gcc 中,ABI 不使用 R2...R9,libgcc 中的代码也不使用 R2...R9(64 位双精度除外)。

在一些带有 avr-gcc 的硬实时应用程序中,我在(过早的)优化中使用了全局 regs,只是为了注意到性能提升是微乎其微的。

然而,本地寄存器变量在集成非 ABI 函数时非常方便,例如不符合 GCC ABI 的汇编函数,不需要汇编包装器。

于 2020-01-08T16:17:56.173 回答