编译器决定放入寄存器的变量的运算符地址会发生什么?

sax*_*_dr 5 c gcc clang compiler-optimization

我知道在 C 中,如果一个变量是用register关键字显式指定的,那么就不能&在它上面使用运算符,这对我来说是有道理的,即没有总是保存在寄存器中的变量的“地址”这样的东西。

我的问题是,如果编译器自行决定将变量存储在寄存器中而不是将其溢出,那么&在代码执行期间运算符会发生什么?

我可以想到编译器可能会尝试处理的两种方法:

  1. 尝试模仿这种&行为,但这似乎很麻烦,我不知道如何严格有效地做到这一点。
  2. 如果&运算符与此变量一起使用,则始终溢出变量。

在这种情况下,C 是采用其中一种方法还是执行其他操作?

Jen*_*edt 5

变量是否在硬件寄存器中实现的事实必须对用户完全透明。由编译器来实现这一点,以便始终可以通过指针访问当前值。

当用户决定使用关键字声明变量时,情况会发生变化register。那么&操作员的使用就被简单地禁止了。


Lun*_*din 1

首先,请注意,register优化过程中非变量发生的情况超出了 C 语言的范围。还有另一种选择:从机器代码中完全删除变量。

我的问题是,如果编译器自行决定将变量存储在寄存器中而不是溢出它,那么在代码执行期间 & 运算符会发生什么?

如果编译器发现存在运算符,则它不太可能将变量放入寄存器中&。事实上,我使用过的每个现实世界的编译器都会将这样的变量放置在堆栈上或静态存储内存中,从而使其可寻址。

  • 我用另一个我认为能更好地说明这一点的例子替换了它。我想我的观点是,源代码中“&”运算符的*存在*并不一定会强制变量有一个地址;仅当实际需要该地址且无法通过优化避免时。 (3认同)