【问题标题】:Pass a register variable by reference通过引用传递寄存器变量
【发布时间】:2014-07-12 02:46:37
【问题描述】:

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

这两个版本有什么区别?

据我了解,ab 保存在 registers 中,因此引用运算符不应该对所做的更改产生任何影响这些寄存器中的值应该在调用者-被调用者边界上保持不变,而不使用引用运算符。

【问题讨论】:

  • register 关键字已弃用。无论它是否存在,99% 的可能性都不会产生影响。
  • 引用转换为机器代码级地址,这会阻止将变量映射到寄存器,除了可能的 PDP-11,AFAIK 没有 C++ 编译器。
  • @Alf 不,PDP-11 也没有寄存器地址。
  • 我想知道根据语言规范是否需要将引用与内存中的位置相关联。或者它们可以被视为替代名称。
  • @cpp_noname 它们可以被视为替代名称,未指定任何特定引用是否需要存储。

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


【解决方案1】:

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

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

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

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

除了阻止使用 alignas() 并在本地之外使用时导致语法错误之外,register 在 C++ 中什么也不做。由于它已被弃用,而且我无法想象有任何理由阻止宏内使用的变量对齐,因此应避免在 C++ 代码中使用寄存器。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 2015-09-24
      • 2010-11-02
      • 2017-03-27
      • 2011-09-16
      相关资源
      最近更新 更多