寄存变量的地址作为自动变量

时间:2015-07-08 06:52:18

标签: c gcc

假设,如果CPU中没有可用的寄存器,则register变量将被视为auto变量。那么我们可以将&运算符应用于它吗?

另外,有没有办法检查具有register存储类的变量是否存储在CPU中?

2 个答案:

答案 0 :(得分:3)

没有。你不能。标准非常清楚,无论是否使用实际的寄存器,都允许在register存储分类变量上应用运算符:

C11,6.7.1存储类说明符,p6

  

具有存储类的对象的标识符声明   说明符寄存器表明对对象的访问速度最快   可能。这些建议有效的程度如下   实现定义。 121

     

121)实施可以简单地将任何注册申报视为   汽车申报。但是,是否可寻址存储   实际使用,声明的对象的任何部分的地址   无法显式地计算存储类说明符寄存器   (通过使用6.5.3.2中讨论的一元&运算符)或隐式   (通过将数组名称转换为指针,如6.3.2.1中所述)。   因此,唯一可以应用于声明的数组的运算符   存储类说明符寄存器是sizeof和_Alignof

(强调我的)

答案 1 :(得分:1)

不,您不能将&应用于具有register存储说明符的变量,无论它是否存储在寄存器中。
(即使特定编译器无法在特定平台上为其分配寄存器,代码也必须有效。)

第6.5.3.2节[地址和间接运算符]说

  

一元&的操作数运算符应该是一个函数   指示符,结果       []或一元*运算符,或指定不是位字段的对象的左值       未使用寄存器存储类说明符声明。

检查变量是否实际存储在寄存器中的方法是检查生成的代码。