【问题标题】:Returning by value from a function - Why does it work?从函数中按值返回 - 为什么它起作用?
【发布时间】:2014-02-14 09:50:03
【问题描述】:

以下是一个返回整数的简单函数定义

int myFunc()
{
    int localVar = 99;
    return localVar;
}

它在 main 中调用为

int main()
{
    int y = myFunc();
    cout << y << endl;
    return 0;
}

这按预期工作。我想知道为什么? localVar 是一个局部变量,它的值是在堆栈中分配的。一旦函数结束,它就会超出范围。那么,localVar 会超出调用 int y = myFunc(); 的范围,它如何/为什么仍然能够返回正确的值?

【问题讨论】:

  • 那么如果是你想的那样返回值的目的是什么?
  • 因为你的函数int myFunc()的返回类型。它允许您传回一个 int 值。变量localVar 确实超出了main() 的范围,但没有使用localVar,y 是。
  • 返回值不是在栈中,而是在寄存器中

标签: c++ c function return return-value


【解决方案1】:

您的函数正在返回值的副本——这就是“按值返回”的意思。
int y = myFunc(); 将从函数使用的临时位置复制值的字节调用本地变量。

只有返回局部变量的地址才会失败。

【讨论】:

  • 再上一句:还是对局部变量的引用。
  • “将复制值的字节”——名义上。一旦优化器完成它,事情可能会有所不同:-)
  • 即使您确实返回了地址,它也可能不会明显失败。它会调用未定义的行为,这似乎可以正常工作。
【解决方案2】:

这里需要注意三件事:

  • 对象localVar
  • myFunc的返回值
  • 对象y

是的,localVarmyFunc 末尾超出范围。然而,在此之前,它的值被复制到myFunc 的返回值中(这就是return 语句所做的)。然后,这个返回值被复制到对象y 中。 localVar 现在不见了也没关系 - 你有它的副本。

这正是按值返回的作用。它将return 语句中的表达式结果复制到返回值中。

【讨论】:

    【解决方案3】:

    localVar 不得在堆栈上生成。如果有可用的寄存器,也可以使用它。

    如果它实际上是在堆栈上创建的,那么无论如何都会在返回时将值复制到寄存器中。

    【讨论】:

    • 这一切都很好,但是寄存器比堆栈槽更短暂。
    • @delnan 我只是想指出没有必要将堆栈用于局部变量。
    • 一般来说很好,它只是没有回答问题:-)
    【解决方案4】:

    由于您的函数的 return 类型:int myFunc()。它允许您传回 int 值。变量localVar在main()中确实超出了作用域,但是localVar并没有在里面使用,y是,当作为y = myFunc()使用时,它接受返回的int值。

    【讨论】:

      猜你喜欢
      • 2019-01-08
      • 2015-07-21
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      相关资源
      最近更新 更多