【问题标题】:Use of & operator in C++ function parameters: pass-by-rvalue-reference [duplicate]在 C++ 函数参数中使用 & 运算符:按右值引用传递 [重复]
【发布时间】:2019-08-17 13:18:34
【问题描述】:

我对这段代码 sn-p 感到有点惊讶!调用者正在传递值,但函数如何处理其地址?

void increase1(int &value) {
   value++;
}

int main() {
   int number = 5;
   increase1(number);
}

如果有人详细解释会很有帮助。谢谢。

【问题讨论】:

标签: c++ pass-by-reference pass-by-rvalue-reference


【解决方案1】:

'increase1(int& value)` 采用“左值参考”。在 C++11 之前,我们只了解了“引用”。所有引用都是左值。

什么是左值?左值的简化定义是编译器可以提供地址的东西。所以,一个变量,比如value,有一个物理存储位置(假设它的内存位置没有被优化掉)。

一个标量,例如 5,甚至是两个变量之和,例如x + y 没有内存位置。编译器不会将 5 存储在内存中。相反,它将5 移动到number 的存储位置。编译器不会将x + y 存储为内存位置。同样,在简化的基础上,5 是一个概念,(x + y) 是一个概念——这些是 r 值。对 R 值的引用是第二种类型的引用 [此处不讨论]。

回到您的出色示例,int &value 描述了一个左值引用,因为value 指的是内存中的一个位置。

main() 函数(假设没有优化)

  1. number 声明为 int 并为数字分配存储空间。在大多数 32 位和 64 位系统上,为数字分配 4 个字节的内存。
  2. 5 是 R 值。编译器创建一条移动指令将5 移动到数字的内存位置。
  3. main() 现在通过传递数字的存储位置调用increase1()。变量通过引用传递,这意味着地址传递给increase1main() 知道传递地址,因为 `increase1() 采用左值引用。
  4. increase1() 接收到 number 的地址并将其解引用以获得 5 值,将解引用的指针加 1,然后将结果存储回地址为 number 的位置。

左值引用允许被调用函数直接修改调用者拥有的存储。

请注意,存储地址是传递的。地址可以来自 main() 的堆栈,也可以来自堆(由 new 分配)。在示例中,main() 从堆栈中分配number,但不必从堆栈中分配。

一种非常冗长的说法,即使用地址传递左值引用,除非编译器认识到它可以通过优化更快地做到这一点。如果编译器优化了引用的实际通道,逻辑理解仍然有效。

【讨论】:

  • 感谢您的详细解答。它清楚地解释了背景中发生的事情。因此,简单地说,我们将地址传递给函数(这是自动完成的)。
  • 是的。我发现在谈论 int& variable 时始终使用“左值参考”一词很有帮助,因为还有两种其他类型的参考需要学习。
【解决方案2】:

因为increase1 引用了int,调用者自动通过引用发送值。

通过引用发送值的功能与发送指针相同,除了

  • 您不必获取地址;它知道自动执行此操作
  • 您可以像使用常规变量一样使用引用
  • 假定引用不为空。这很有用,因为这意味着您不必在接受引用的函数内进行空检查。

如果引用来自指针,请在将指针转换为引用之前检查以确保指针不为空。如果您已经知道指针不为空,那么您不必检查(当然)。

【讨论】:

  • 所以引用是自动处理的,我们可以像变量一样使用引用。明白了,谢谢。 @豪尔赫佩雷斯
  • 是的!这就是让引用很棒的原因:) 此外,没有办法重新分配引用,因此您不会意外更改它引用的内容。
【解决方案3】:

这是一个参考。

`int a;   //variable
int @a;  //reference
int *a;  //pointer`

引用就像一个指针,你必须先初始化并且不能改变。但是您可以更改该地址的值。在声明之后,您不需要在它前面加上 *。

权利声明示例: int &a=b; 现在要使用它,您只需编写 a。而当你改变a时,b

也会发生同样的变化

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多