【问题标题】:Is there a way to force a C++ compiler to store a variable in a register? [duplicate]有没有办法强制 C++ 编译器将变量存储在寄存器中? [复制]
【发布时间】:2020-09-04 13:36:16
【问题描述】:

我知道 inline 关键字使编译器更有可能内联函数,尽管决定权取决于编译器,而 GNU 扩展 __attribute__((always_inline)) 强制编译器内联它。
相应地,有没有……

__attribute__((always_register)) register int foo = 678;

...或类似的东西?

【问题讨论】:

  • 如果你always_register的变量多于寄存器会怎样?
  • @RaymondChen 如果不能内联标记为 always_inline 的函数,也会发生同样的事情。
  • force 希望没有,编译器比你更清楚该做什么,你不确定是否有足够的寄存器用于其余代码,以及当你调用函数时/方法被调用者无法知道寄存器是“保留”的,因此该值必须保存在其他地方
  • 如果您需要这种级别的控制,请自己在汇编程序中编写。如果这是出于性能原因,请相信编译器或自己在汇编中编写它。
  • 有一个名为register 的关键字(仍然存在,但现在已弃用)给编译器一个提示,表明在其中存储一些内容是个好主意一个寄存器。现在人们大多依靠编译器优化来找出最好的。

标签: c++ cpu-registers


【解决方案1】:

GCC 可以通过使用关键字asm and register 为局部变量指定寄存器:

register int *foo asm ("r12");

注意引用:

此功能唯一受支持的用途是指定寄存器 调用扩展asm时的输入输出操作数。

此功能在某些架构的 Linux 内核中用于访问存储在通用寄存器之一中的线程本地存储。这就是current宏在ARC architecture上的实现方式:

register struct task_struct *curr_arc asm("r25");
#define current (curr_arc)

这种用法很有趣,因为它在全局范围内使用 register 关键字,而在标准 C 中它只能在本地使用。

【讨论】:

  • 非常有趣。这个答案在副本中也可能很有价值。
  • 这是否会引发 C++14/17/... 错误,因为 register 不再是有效的关键字?
  • @MichaelDorgan 这是一个扩展,所以我认为它不应该。 GCC 似乎没有产生任何错误/警告。
猜你喜欢
  • 2013-11-11
  • 2014-08-04
  • 2012-11-25
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
相关资源
最近更新 更多