通过引用传递寄存器变量

时间:2014-07-12 02:46:38

标签: c++ compiler-construction pass-by-reference register-keyword

我见过代码,其中带有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; 
}

两个版本之间有什么区别?

根据我的理解, a b 保存在寄存器中,因此参考运算符不会对所做的更改产生任何影响这些寄存器中的值应该在调用者 - 被调用者边界上持续存在,而不使用引用运算符。

2 个答案:

答案 0 :(得分:4)

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

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

这在宏中有时非常有用,可以防止客户端获取仅应用作值的内容的地址。

在C ++ 11标准中不推荐使用 register (请参阅[depr.register])。在C ++中,获取寄存器变量的地址是合法的,但在最新版本的C ++ 11标准中,使用alignas声明寄存器变量的对齐是不合法的。 See 7.6.2 Alignment specifier

除了防止使用alignas()并在本地外部使用时导致语法错误, register 在C ++中什么都不做。由于它已被弃用,并且因为我无法想象你想要阻止宏内部使用的变量的对齐,你应该避免在C ++代码中使用寄存器。

要回答这个问题:在C ++中,您的代码与删除了 register 的等效代码之间没有区别,因此您的"两个版本"有明显不同的方式。

答案 1 :(得分:-1)

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

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

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