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关键字有用时相比,它们在优化方面要好得多.我希望针对利基目标平台的编译器更加认真地对待它.
该register关键字在C和C++中具有不同的含义.在C++中,它实际上是多余的,现在似乎甚至被弃用了.
在C中它是不同的.首先不要从字面上理解关键字的名称,它并不总是与现代CPU上的"硬件寄存器"有关.对register变量施加的限制是你不能取其地址,&不允许操作.这允许您标记变量以进行优化,并确保编译器在您尝试获取其地址时会对您大喊大叫.特别是一个register也是const合格的变量永远不会别名,所以它是优化的一个很好的候选者.
register系统地使用C语言系统会强制您考虑每个获取变量地址的位置.这可能是你在C++中想要做的事情,它很大程度上依赖于对象和类似事物的引用.这可能是C++没有register从C 复制此变量属性的原因.
一般来说是不可能的。具体可以采取一些措施来增加概率:
使用适当的优化级别,例如。-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)