【问题标题】:returning arrays and objects created in functions in various languages返回在各种语言的函数中创建的数组和对象
【发布时间】:2015-05-16 21:35:05
【问题描述】:

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

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

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

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

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

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

提前致谢。

【问题讨论】:

  • Java int[] array = new int[3] 对应于 C++ int* array = new int[3]()。 C++(或 C)int array[3] 没有 Java 等价物。
  • 这不是编译语言与解释语言的问题。有些语言有垃圾收集,因为它很方便并且减少了错误的范围;其他人则不这样做,因为更简单的对象管理方案可能更有效。

标签: java python c++ c arrays


【解决方案1】:
  1. C 有对象,例如结构的实例。您可以从函数中安全地返回它们,前提是它们没有引用函数本地变量的数据成员。您不能返回数组,因为它们不可复制。但是您可以安全地返回带有数组数据成员的结构,在这种情况下,数组会被复制。

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

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

  4. 类似于 Java。 Lifetime 不受范围限制,因此从函数返回任何类型的对象都非常好。

【讨论】:

    【解决方案2】:

    扩展一点答案:

    Python 通过引用计数来管理生命周期。当一个对象没有引用时,它将被破坏或最终确定并释放。 在 Java 中,我认为这完全一样

    【讨论】:

    • 我认为它不像那样具有确定性。通常,当引用计数变为零时,对象可以被释放,但不一定被释放。何时以及如何发生的细节取决于垃圾收集算法和实现。
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    相关资源
    最近更新 更多