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; 
}

两个版本有什么区别?

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

4

2 回答 2

4

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

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

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

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

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

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

于 2014-07-12T03:14:54.433 回答
-1

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

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

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

于 2014-07-12T03:20:17.583 回答