返回在各种语言的函数中创建的数组和对象

returning arrays and objects created in functions in various languages

本文关键字:创建 数组 对象 函数 语言 返回      更新时间:2023-10-16

我对返回在函数调用中本地创建的数组和对象有点困惑。所以我相信——

  1. C - 没有对象,只能在堆栈上创建数组和结构,因此在函数返回时将被删除。因此,将它们作为返回值发送到调用模块是不明智的。

  2. C++ - 对象和结构驻留在堆中,因此可以返回对象,但不能返回其他内容,即数组在返回时仍会被销毁

  3. Java - 我可以返回数组和对象,我想数组移动到这里

  4. 堆?
  5. Python - 与Java相同,本地创建的对象和数组可以返回到调用模块作为参考。

如果我在某处错了,请纠正我。现在为什么java/python会把数组放在堆中?被解释语言是原因吗?因此,每种编译语言都不会让我将本地创建的数组返回到调用模块。

提前谢谢。

  1. C 具有对象,例如结构体的实例。您可以从函数安全地返回这些变量,前提是它们没有引用函数本地变量的数据成员。您无法返回数组,因为这些数组不可复制。但是,您可以安全地返回包含数组数据成员的结构,在这种情况下,将复制数组。

  2. 与 C 相同,对象是结构或内置的实例。 structsclasses相同。它们是否在"堆"上取决于您如何实例化它们(这在 C 中完全相同)。唯一的区别是C++具有返回值优化 (RVO),它允许在许多情况下省略副本。

  3. 我不确定返回数组的确切语义,但 Java 具有引用语义,因此通常对象的生命周期会超出其范围。

  4. 类似于Java。生存期不受作用域的限制,因此从函数返回任何类型的对象都是完全可以的。

来扩展一下答案:

Python 通过引用计数来管理生命周期。当对象没有引用时,它将被销毁或最终确定并释放。在Java中,我认为这种情况完全相同