我对在函数调用中本地创建的返回数组和对象感到困惑。所以我相信 -
C - 没有对象,只能在堆栈上创建数组和结构,因此在函数返回时将被删除。因此,将它们作为返回值发送到调用模块是不明智的。
C ++ - Objects &结构驻留在堆中,因此可以返回对象但没有其他内容,即返回时仍会销毁数组
Java - 我可以返回数组和对象,我猜数组在这里移动到了堆?
Python - 与Java相同,本地创建的对象和数组可以作为参考返回给调用模块。
如果我错了,请纠正我。现在为什么java / python会将数组放入堆中?正在解释语言的原因是什么?因此,每种编译语言都不会让我将本地创建的数组返回给调用模块。
提前致谢。
答案 0 :(得分:4)
C具有对象,例如结构的实例。您可以安全地从函数返回这些函数,前提是它们没有引用函数本地变量的数据成员。您无法返回数组,因为它们不可复制。但是你可以安全地返回带有数组数据成员的结构,在这种情况下会复制数组。
与C相同。对象是结构体或内置插件的实例。 structs
与classes
相同。它们是否在“堆”上取决于你如何实例化它们(这在C中是完全相同的)。唯一的区别是C ++有return value optimization (RVO)允许在许多情况下省略副本。
我不确定返回数组的确切语义,但Java具有引用语义,因此通常对象的生命周期超出其范围。
与Java类似。生命周期不限于范围,因此从函数中返回任何类型的对象都是完美的。
答案 1 :(得分:1)
延伸一点答案:
Python通过引用计数管理生命周期。当一个对象没有引用时,它将被破坏或最终确定并释放。 在Java中我认为发生完全相同的