0

我看过代码,其中带有register关键字的变量通过引用传递给函数。通过引用传递一个寄存器变量

版本1:

inline static void swap(register int &a, register int &b) 
{ 
    register int t = a; 
    a = b; 
    b = t; 
} 

版本2:

inline static void swap(register int a, register int b) 
{ 
    register int t = a; 
    a = b; 
    b = t; 
} 

什么是两个版本之间的差异?

据我了解,一个b保持在寄存器因此参考运营商不应该有任何的效果在这些寄存器中的值所做的更改应在整个主叫 - 被叫边界仍然存在,而无需使用参考运算符。

+4

“register”关键字已弃用。无论是否存在,99%都不会有什么区别。 – chris

+0

引用转换为机器代码级地址,它可以防止将变量映射到除可能用于PDP-11以外的寄存器,对此,AFAIK不存在C++编译器。 –

+0

@Alf不,PDP-11也没有寄存器地址。 – EJP

回答

4

在C程序中,不能取寄存器变量的地址。

register int x; 
int * p = &x; // Compiler error 

这在宏中有时很有用,它可以防止客户端获取只应该用作值的地址。

使用寄存器在C++ 11标准中已被弃用(请参见[depr.register])。在C++中,采用寄存器变量的地址是合法的,但是在C++ 11标准的最新版本中声明具有alignas的寄存器变量的对齐方式是不合法的。 See 7.6.2 Alignment specifier

除了防止使用alignas()并在本地使用外部时引起语法错误,寄存器在C++中不做任何事情。既然它已经被弃用了,并且因为我无法想象任何你想要防止宏内部使用的变量对齐的原因,你应该避免在C++代码中使用寄存器。

要回答这个问题:在C++中,您的代码和寄存器删除后的等效代码没有区别,因此您的“两个版本”以不同的方式显而易见。

-1

对于C++程序,计算机的内存就像一系列的存储单元,每个存储单元的大小都是一个字节,每个存储单元都有一个唯一的地址。这些单字节存储单元的排列方式允许大于一个字节的数据表示占用具有连续地址的存储单元。

这样,每个单元格都可以通过其唯一地址轻松地定位到内存中。例如,地址为1776的存储单元总是紧跟在地址1775之后的单元之后并且在1777之前,并且恰好在776之后的一千个单元以及在2776之前的恰好一千个单元。

当变量是声明,存储其值所需的内存将分配给内存中的特定位置(其内存地址)。通常,C++程序不主动决定其变量存储位置的确切内存地址。幸运的是,这个任务留给程序运行的环境 - 通常是一个在运行时决定特定内存位置的操作系统。但是,程序可以在运行时获取变量的地址,以便访问与其相关的特定位置的数据单元可能很有用。