如何在寄存器中存储C++变量

ash*_*mar 13 c++ inline-assembly cpu-registers

关于存储寄存器变量的一点,我想澄清一下:有没有办法确保如果我们在代码中声明了一个寄存器变量,它只能存储在寄存器中?

#include<iostream>
using namespace std;
int main()
{
register int i=10;// how can we ensure this will store in register only.
i++;
cout<<i<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*eld 29

你不能.这只是编译器的暗示,表明该变量被大量使用.这是C99的措辞:

对具有存储类指定的对象的标识符声明register表明对对象的访问尽可能快.这些建议有效的程度是实施 - 定义.

这是C++ 11的措辞:

一个register说明符是一种提示,如此声明的变量将被频繁使用的实现.[注意:提示可以忽略,在大多数实现中,如果采用变量的地址,它将被忽略.不推荐使用此功能(参见D.2). - 尾注]

实际上,register在C++ 11(附件D.2)中不推荐使用存储类说明符:

不推荐使用register关键字作为存储类说明符(7.1.1).

请注意,您不能register在C中获取变量的地址,因为寄存器没有地址.在C++中删除了这个限制,并且几乎可以保证获取地址以确保变量不会在寄存器中结束.

许多现代编译器只是忽略了registerC++中的关键字(当然,除非它以无效的方式使用).与register关键字有用时相比,它们在优化方面要好得多.我希望针对利基目标平台的编译器更加认真地对待它.

  • @PeteBecker谁需要RAM?我都是登记册! (4认同)

Jen*_*edt 6

register关键字在C和C++中具有不同的含义.在C++中,它实际上是多余的,现在似乎甚至被弃用了.

在C中它是不同的.首先不要从字面上理解关键字的名称,它并不总是与现代CPU上的"硬件寄存器"有关.对register变量施加的限制是你不能取其地址,&不允许操作.这允许您标记变量以进行优化,并确保编译器在您尝试获取其地址时会对您大喊大叫.特别是一个register也是const合格的变量永远不会别名,所以它是优化的一个很好的候选者.

register系统地使用C语言系统会强制您考虑每个获取变量地址的位置.这可能是你在C++中想要做的事情,它很大程度上依赖于对象和类似事物的引用.这可能是C++没有register从C 复制此变量属性的原因.


Aki*_*nen 5

一般来说是不可能的。具体可以采取一些措施来增加概率:

使用适当的优化级别,例如。-O2

保持变量数量较小

register int a,b,c,d,e,f,g,h,i, ... z;  // can also produce an error
// results in _spilling_ a register to stack
// as the CPU runs out of physical registers
Run Code Online (Sandbox Code Playgroud)

不要获取寄存器变量的地址。

register int a;
int *b = &a;  /* this would be an error in most compilers, but
                 especially in the embedded world the compilers
                 release the restrictions */
Run Code Online (Sandbox Code Playgroud)

在某些编译器中,您可以建议

register int a asm ("eax");  // to put a variable to a specific register
Run Code Online (Sandbox Code Playgroud)