我应该在我的代码中使用register关键字吗?

Tim*_*Tim 6 c

我应该在我的phone变量上使用register关键字吗?我有这个:

void *anything(Caller *caller)
{
   register void *phone = caller->phone;
   /* or this */
   void *phone = caller->phone;

   if (phone)
   {
       return phone;
   }
   return NULL;
}
Run Code Online (Sandbox Code Playgroud)

有区别吗?我该怎么办?

sar*_*old 11

register关键字旨在作为编译器的优化提示.问题是,编译器比你更了解你的代码,现在不需要这么简单的提示来生成更好的代码.

所以register现代编译器唯一能做的就是阻止你使用&变量的地址.而已.

  • 它对于某些嵌入式系统仍然非常有用,例如,如果您的定时事件需要亚微秒精度(或确切的 CPU 周期数),并且在 C 代码中使用内联汇编。在最近的一个项目中,“register”关键字允许我用汇编语言编写 5% 的代码,而用 C 语言编写 95% 的代码。如果没有它,我就需要用汇编语言编写 100% 的代码。 (2认同)

Mat*_*lia 5

没有register与之结合使用的"特殊规则" void *,registervoid *与任何变量一起工作,向编译器建议这样的变量将被大量使用并且应该将其放入CPU寄存器中.

尽管如此,通常没有理由在register任何地方使用,因为当前编译器中包含的优化器比编程器更好地猜测应该将哪些变量放入寄存器,并且几乎总是会很乐意register完全忽略该关键字.

C99标准还提供了一些关于register(§6.7.14)的更多细节:

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

101)实施可以将任何register声明简单地视为auto声明.但是,无论是否实际使用了可寻址存储,使用存储类说明符寄存器声明的对象的任何部分的地址都无法显式(通过使用&6.5.3.2中讨论的一元运算符)或隐式(通过将数组名称转换为指针,如6.3.2.1中所述.因此,唯一可以应用于使用存储类说明符声明的数组的运算符registersizeof.

所以使用register你最有可能只是假装在寄存器中有变量的缺点.:)请注意,C++标准放宽了这些限制,但显然如果你试图获取register变量的地址,它将不再保留在寄存器中.

长话短说,register主要是作为过去的遗物,避免它是你可以做的最好的用途.:)