Tom*_*Tom 92

register 是对编译器的提示,建议它将该变量存储在处理器寄存器而不是存储器中(例如,而不是堆栈).

编译器可能会也可能不会遵循该提示.

根据Herb Sutter的"不是关键词(或者,由另一个名字评论)":

寄存器说明符与自动说明符具有相同的语义...

  • @LewisKelsey 它在 C++17 规范中未使用和保留;它不是语法中的“存储类说明符”之一,并且没有定义的语义。符合标准的编译器可能会像 Clang 那样抛出错误。尽管如此,一些实现仍然允许它,并且要么忽略它(MSVC、ICC),要么将其用作优化提示(GCC)。请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0001r1.html。不过,我确实说错了一点:它在 C++11 中已被弃用。 (6认同)
  • 从C ++ 17开始,已弃用,未使用和保留它。 (2认同)

Fre*_*son 43

根据Herb Sutter的说法,register" 与空白完全一样有意义 "并且对C++程序的语义没有影响.


Kei*_*thB 24

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


sup*_*cat 17

在2010年存在的C++中,任何使用关键字"auto"或"register"的有效程序在语义上都与删除了这些关键字的程序相同(除非它们出现在字符串化的宏或其他类似的上下文中).从这个意义上说,关键字对于正确编译程序是无用的.另一方面,关键字在某些宏上下文中可能很有用,以确保宏的不正确使用会导致编译时错误,而不是产生伪代码.

在C++ 11及更高版本的语言中,auto关键字被重新用作初始化对象的伪类型,编译器将自动替换为初始化表达式的类型.因此,在C++ 03中,声明:auto int i=(unsigned char)5;等同int i=5;于在块上下文中使用时,并且auto i=(unsigned char)5;是违反约束的.在C++ 11中,auto int i=(unsigned char)5;成为一个约束违反,而auto i=(unsigned char)5;变得相当于auto unsigned char i=5;.

  • 最后一位的示例可能是有用的. (21认同)
  • 这个答案不再正确,自2011年以来,关键字"auto"不能简单地省略......也许你可以更新你的答案. (13认同)
  • 根据http://en.cppreference.com/w/cpp/language/auto,发布C++ 11,`auto`现在用于自动类型演绎但在此之前,它用于指定你想要你的变量要"自动"存储(因此在*堆栈*我猜),而不是关键字`register`(意思是"处理器的寄存器"): (3认同)
  • @Walter:你能举出一些变化吗?我没有遵循所有的语言变化. (2认同)
  • @supercat,是的,目前,但不推荐使用`register`,并且将有一项建议将其删除以用于 C++17。 (2认同)

Jam*_*ran 7

几乎肯定没什么.

register是您计划使用x很多的编译器的提示,并且您认为它应该放在寄存器中.

但是,编译器现在要更好地确定应该在寄存器中放置哪些值而不是普通(甚至是专家)程序员,因此编译器只是忽略关键字,并按照自己的意愿行事.


nco*_*ers 7

register关键字对于:

  • 内联汇编.
  • 专家C/C++编程.
  • 可缓存的变量声明.

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

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

它已在C++ 17上弃用

  • 我想补充一点,'register'关键字只对运行单个C++程序而没有线程且没有多任务的微控制器有用.C++程序必须拥有整个CPU,以确保'register'变量不会从特殊的CPU寄存器中移出. (2认同)
  • @SantiagoVillafuerte 这实际上不是真的,在多任务系统中,当上下文切换操作系统(而不是应用程序)负责保存/恢复寄存器时。由于您不是在每条 CPU 指令之后都进行上下文切换,因此将内容放入寄存器中绝对有意义。这里的其他答案(编译器在涉及寄存器分配时根本不关心您的意见)更准确。 (2认同)
  • 您展示的示例实际上是使用[GCC 的显式寄存器变量扩展](https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html#Local-Register-Variables),这与`register` 存储类说明符,并且仍然受 GCC 支持。 (2认同)

usr*_*567 6

register 在C++ 17之前不推荐使用,它是未使用的和保留的.

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