C++中寄存器的值范畴

0ve6wy6x  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(118)

我在C++中遇到了关键字register,我对它的value category很好奇。变量是用register关键字lvalue创建的(因为它们可以被引用)还是用rvalue创建的(因为它们存储在处理器寄存器中,不能通过指向它们在内存中的地址的指针访问)?
我已经研究了cppreference上面链接中的基本类别值,但我不明白根据这些定义,寄存器变量应该放在哪里。

bwntbbo3

bwntbbo31#

变量是用register关键字lvalue创建的(因为它们可以被引用)还是用rvalue创建的(因为它们存储在处理器寄存器中,不能通过指向它们在内存中的地址的指针访问)?
这个问题完全是错误的,没有任何意义。变量没有“值类别”属性。
“Value category”是 expressions 的属性。例如,命名变量的id表达式是左值表达式,不管它是什么类型的变量。register并没有改变这一点。然而,变量或对象没有值类别。
只有左值可以被引用也是错误的。这又是一个分类错误,因为引用绑定到 * 对象 *,而不是表达式。任何对象都可以被引用引用,尽管某些类型的引用只允许某些值类别用于其初始化表达式。
同样的,指针也不是指向表达式,而是指向对象,同样,每个对象都可以被指向。
的确,内置的&运算符不能应用于右值表达式,但这并不妨碍例如。临时对象的地址。这只是(故意)使它更难做到这一点。因为命名变量的id表达式总是左值表达式,所以内置的&总是可以应用于它们。register关键字根本不影响这一点。
register关键字(在它被弃用并从语言中删除之前)除了提示编译器将该变量保存在寄存器中可能更好之外没有任何功能。它没有以任何方式限制声明为register的变量的使用,也没有强制编译器将对象实际保存在寄存器中。因为编译器很长时间以来都足够聪明,可以自己决定哪些对象应该保存在寄存器中,所以register不再有任何实际用途。

cvxl0en2

cvxl0en22#

你找过register on cppreference吗?它说得很清楚:这个关键字从C++17开始就没有使用过。在此之前,它只是对编译器的一个提示(可能很久以前就被忽略了),如您所见here

628mspwn

628mspwn3#

register被弃用或删除,具体取决于C++标准版本。
如果它没有被弃用,那么它将类似于volatile,这会改变编译器处理变量的方式,但不会改变其值类别。你可以有一个volatile左值,右值等。

相关问题