用gcc/g++编译C/C++代码时,如果忽略了我的寄存器,能告诉我吗? 例如,在这段代码中
int main()
{
register int j;
int k;
for(k = 0; k < 1000; k++)
for(j = 0; j < 32000; j++)
;
return 0;
}
j 将用作寄存器,但在此代码中
int main()
{
register int j;
int k;
for(k = 0; k < 1000; k++)
for(j = 0; j < 32000; j++)
;
int * a = &j;
return 0;
}
j 将是一个普通变量。 它能告诉我我使用寄存器的变量是否真的存储在 CPU 寄存器中吗?
最佳答案
您完全可以假设 GCC 会忽略 register
关键字,除了 -O0
。但是,它不应该以任何方式产生影响,如果您深入了解,您应该已经在阅读汇编代码了。
这是关于此主题的信息线程:http://gcc.gnu.org/ml/gcc/2010-05/msg00098.html .在过去,register
确实帮助编译器将变量分配到寄存器中,但今天寄存器分配可以自动优化地完成,无需提示。关键字在 C 语言中继续服务于两个目的:
- 在 C 中,它会阻止您获取变量的地址。由于寄存器没有地址,这个限制可以帮助简单的 C 编译器。 (不存在简单的 C++ 编译器。)
register
对象不能声明为restrict
。因为restrict
与地址有关,所以它们的交集没有意义。 (C++ 还没有restrict
,反正这个规则有点琐碎。)
对于 C++,该关键字自 C++11 和 proposed for removal 以来已被弃用来自计划于 2017 年进行的标准修订。
一些编译器在参数声明中使用 register
来确定函数的调用约定,ABI 允许混合基于堆栈和寄存器的参数。这似乎是不符合规范的,它往往会出现在像 register("A1")
这样的扩展语法中,我不知道是否还有这样的编译器在使用。
关于c++ - gcc/g++ 可以在忽略我的寄存器时告诉我吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3500301/