gcc忽略注册声明的情况?

时间:2013-09-13 12:11:28

标签: c gcc compiler-construction

K& R说

  

编译器可以自由地忽略这些建议(注册声明)。

在什么情况下,如果我定义register int x = 4;

,gcc会忽略

3 个答案:

答案 0 :(得分:4)

这完全取决于实现。

通常,您应该信任编译器将变量放入寄存器而不是自己定义它们。

  

C99 6.7.1存储类说明符

     

具有存储类说明符register的对象的标识符声明   建议尽可能快地访问对象。这种程度的程度   建议是有效的是实施定义。

另外,C ++ 11已经不再使用register关键字作为存储类说明符,可能在将来的某个时候C也会这样做。

答案 1 :(得分:2)

通过将变量声明为‘register’,我们只请求(不强制)编译器将变量a存储在CPU寄存器中。编译器将决定存储变量的位置。

如果已将更多变量声明为register,则由于CPU寄存器受限,因此很少有变量可能会进入CPU寄存器。这又是依赖于实现的。

答案 2 :(得分:1)

如果我们参考C99草案标准,我们会看到这是实现定义的,6.7.1 存储类说明符 4 表示:

  

具有存储类说明符寄存器的对象的标识符声明   建议尽可能快地访问对象。这种程度的程度   建议有效是实施定义的

来自gcc邮件列表的

This thread似乎表明您是否跟踪了register已被忽略一段时间的线程,除非您不使用优化(< em>使用-O0 )。

请注意,使用register会产生另一个影响,因为它会阻止使用地址运算符(&)。