K& R说
编译器可以自由地忽略这些建议(注册声明)。
在什么情况下,如果我定义register int x = 4;
?
答案 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
会产生另一个影响,因为它会阻止使用地址运算符(&
)。