memory-management - 按引用调用和按值返回调用有什么区别

标签 memory-management parameter-passing computer-science

正如标题所说,我很好奇“按引用调用”和“按值返回调用”之间的区别。我在一些文献中读到过它,并试图在互联网上找到更多信息,但我只找到了“按值调用”和“按引用调用”的比较。

我确实理解两者之间在内存层面上的差异,但不明白在“概念”层面上的差异。

被调用的子例程将拥有自己的实际参数值副本来使用,但当它结束执行时,会将新的本地值(绑定(bind)到形式参数)复制回调用者的实际参数。

什么时候按值返回调用实际上比“按引用调用”更受欢迎?有什么示例场景吗?我所看到的是,由于复制内存单元中的值,它需要额外的内存和执行时间。

作为一个附带问题,“按值返回调用”是否在“现代”语言中实现?

最佳答案

按值调用返回,来自 Wikipedia :

This variant has gained attention in multiprocessing contexts and Remote procedure call: if a parameter to a function call is a reference that might be accessible by another thread of execution, its contents may be copied to a new reference that is not; when the function call returns, the updated contents of this new reference are copied back to the original reference ("restored").

因此,从更实际的角度来说,变量完全有可能在函数执行过程中处于某种不期望的状态。对于并行处理,这是一个问题,因为您可以尝试在变量具有此值时访问该变量。将其复制到临时值可以避免此问题。

举个例子:

policeCount = 0

everyTimeSomeoneApproachesOrLeaves()
  calculatePoliceCount(policeCount)

calculatePoliceCount(count)
  count = 0
  for each police official
    count++

goAboutMyDay()
  if policeCount == 0
    doSomethingIllegal()
  else
    doSomethingElse()

假设 everyTimeSomeoneApproachesOrLeavesgoAboutMyDay 并行执行。

因此,如果您通过引用传递,则在 calculatePoliceCount 中将 policeCount 设置为 0 后,您最终可能会立即获得 policeCount,即使周围有警察,那么您最终会做一些非法的事情,可能会入狱,或者至少会受贿。如果您按值返回传递,则不会发生这种情况。

支持的语言?

在我的搜索中,我发现 Ada 和 Fortran 支持这一点。其他人我不知道。

关于memory-management - 按引用调用和按值返回调用有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18380166/

相关文章:

c# - 在字符串列表中搜索字符串的有效方法?

mysql - 在 MySQL 存储过程中的 WHERE 子句中使用 IN 参数

java - Struts 2 - 当第二个操作与表单一起使用时,在操作之间传递参数会丢失

algorithm - SiftDown 算法比较次数

computer-science - 为什么是二进制而不是三进制计算?

ios - 需要澄清 iPhone 内存管理

ios - 一些残留内存从未通过 ARC 释放?

algorithm - 合并排序 : Are the additional array copies necessary?

C 函数中的类型与参数冲突

c - 我需要在C中添加字符串字符。A + B必须= C。字面意思