关于寄存器变量的存储,我希望能得到一些澄清:如果我们在代码中声明了一个寄存器变量,有没有办法确保它只会被存储在寄存器中?
#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;
}
关于寄存器变量的存储,我希望能得到一些澄清:如果我们在代码中声明了一个寄存器变量,有没有办法确保它只会被存储在寄存器中?
#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;
}
register(4)
并且变量最终会在寄存器 4 中的日子。(然后你会跟着几个 gen
过程调用来完成汇编工作。) - Hot Licksregister
关键字在 C 和 C++ 中有不同的含义。在 C++ 中,它实际上是多余的,甚至似乎已经被废弃了。register
变量施加的限制是您不能获取它们的地址,即不允许使用 &
操作符。这使您可以将变量标记为进行优化,并确保编译器会在尝试获取其地址时向您发出警告。特别地,一个同时具有 const
限定符的 register
变量永远不可能与其他变量重名,因此它是进行优化的好选择。register
强制您考虑每个获取变量地址的地方。这可能不是您想在 C++ 中做的事情,因为 C++ 严重依赖于对象的引用等内容。这可能是为什么 C++ 没有从 C 中复制 register
变量的这个属性的原因之一。一般情况下是不可能的。具体而言,可以采取一些措施来增加概率:
使用适当的优化级别,例如 -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
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 */
register int a asm ("eax"); // to put a variable to a specific register
register ... asm()
本地变量不再保证除了为“r”约束选择该寄存器之外的任何内容。实际上,GCC仍然使用指定的寄存器;clang在asm
语句之外不使用。相关链接:将寄存器值读入C变量。 - Peter Cordesint main() {
volatile register int x asm ("eax");
int y = *(&x);
return 0;
}
对我来说,在这种情况下,g++编译器会抛出以下错误。
[nsidde@nsidde-lnx cpp]$ g++ register_vars.cpp
register_vars.cpp: In function ‘int main()’:
register_vars.cpp:3: error: address of explicit register variable ‘x’ requested
代码中的'volatile register int x asm ("eax")'指示编译器将整数x存储在'eax'寄存器中,并在此过程中不进行任何优化。这将确保该值直接存储在寄存器中。这就是为什么访问变量地址会引发错误的原因。
或者,C编译器(gcc)可能会在以下代码中出现错误。
int main() {
register int a=10;
int c = *(&a);
return 0;
}
[nsidde@nsidde-lnx cpp]$ gcc register.c
register.c: In function ‘main’:
register.c:5: error: address of register variable ‘a’ requested
asm("eax")
语法正是我在寻找的。感谢你实际回答了我的问题。 - benathon这只是对编译器的提示;你不能强制它将变量放置在寄存器中。无论如何,编译器作者可能比应用程序员更了解目标架构,因此更适合编写能够进行寄存器分配决策的代码。换句话说,使用register
不太可能实现任何目的。
ostream& ostream :: operator<<(ostream& os,int x)
内部触及内存。-O3
编译通常足够了,编译器通常很好地确定要保存在寄存器中的变量。无论如何,在内部循环中存储变量仅是性能调整的一个小方面,更重要的方面是确保在内部循环中不进行不必要或昂贵的工作。volatile register int i = 10
来确保i
被存储在寄存器中。 volatile
关键字将不允许编译器优化变量i
。