gcc/g ++可以告诉我何时忽略了我的注册?

Qia*_*ian 4 c c++ gcc g++ cpu-registers

使用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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

j将是一个正常变量.它可以告诉我我使用寄存器的变量是否真的存储在CPU寄存器中?

Pot*_*ter 7

你可以公平地假设GCC忽略了register关键字,除非at -O0.但是,它不应该以某种方式产生影响,如果你处于这样的深度,你应该已经阅读了汇编代码.

以下是有关此主题的信息主题:http://gcc.gnu.org/ml/gcc/2010-05/msg00098.html.回到过去,register确实帮助编译器将一个变量分配到寄存器中,但今天的寄存器分配可以自动完成,无需提示.该关键字在C中继续有两个用途:

  1. 在C中,它会阻止您获取变量的地址.由于寄存器没有地址,因此这种限制可以帮助简单的C编译器.(简单的C++编译器不存在.)
  2. 一个register对象不能声明restrict.因为restrict属于地址,它们的交集是没有意义的.(C++还没有restrict,无论如何,这条规则有点小事.)

对于C++,该关键字自C++ 11以来已被弃用,并建议从2017年的标准修订版中删除.

一些编译器使用register参数声明来确定函数的调用约定,ABI允许混合的基于堆栈和寄存器的参数.这似乎是不一致的,它往往会出现扩展语法register("A1"),我不知道是否还有这样的编译器在使用.


Pas*_*uoq 7

关于现代编译和优化技术,register注释根本没有任何意义.在你的第二个程序中,你取地址j,寄存器没有地址,但一个相同的本地或静态变量可以很好地存储在它的生命周期中的两个不同的存储单元中,或者有时存储在存储器中,有时存储在寄存器中,或者不存在存在的.实际上,优化编译器会将您的嵌套循环编译为空,因为它们没有任何效果,只需将它们的最终值分配给kj.然后省略这些分配,因为剩下的代码不使用这些值.