在C ++中注册关键字

有什么区别

int x=7; 

 register int x=7; 

我正在使用C ++。

在C ++中,任何使用关键字“auto”或“register”的程序在语义上都与删除关键字的语义相同(除非它们出现在stringmacros或其他类似的上下文中)。 从这个意义上说,这些关键字对于正确编译程序是没有用的。 另一方面,这些关键字在某些macros的上下文中可能是有用的,以确保不恰当地使用macros将导致编译时错误,而不是产生伪造的代码。

register是编译器的一个提示,build议它将该variables存储在处理器寄存器而不是内存中(例如,而不是堆栈)。

编译器可能会或可能不会遵循该提示。

根据“不是(或者,别名)的关键词”中的 Herb Sutter:

一个注册说明符具有与自动说明符相同的语义…

根据Herb Sutter的说法, register “和空白一样有意义 ”,对C ++程序的语义没有任何影响。

用今天的编译器,可能什么也没有。 原本是一个提示将variables放在寄存器中以便更快地访问,但是今天大多数编译器都忽略了这个提示并自行决定。

几乎肯定没有。

register是编译器的一个暗示,你计划使用x很多,而且你认为它应该放在一个寄存器中。

然而,编译器现在更好地确定哪些值应该放在寄存器中,而不是平均(甚至是专家)程序员,所以编译器只是忽略关键字,并按照自己的意愿去做。

register被弃用,直到C ++ 17,它是未使用和保留。

来源: http : //en.cppreference.com/w/cpp/keyword/register

register关键字对于:

  • 内联汇编。
  • 专家C / C ++编程。
  • cachingvariables声明。

一个生产系统的例子,其中需要register关键字:

 typedef unsigned long long Out; volatile Out out,tmp; Out register rax asm("rax"); asm volatile("rdtsc":"=A"(rax)); out=out*tmp+rax; 

它已经在C ++ 17上被弃用了