函数中的引用变量加载到堆和栈之间的内存中在哪里?

Where is the reference variable in function loaded in memory between heap and stack?

我已经创建了一个函数来从父游戏对象的所有子游戏对象中获取“RectTransform”组件。

using UnityEngine;

public class Test_Script : MonoBehaviour
{
    public GameObject parent_G;
    RectTransform[] child_R;

    private void Awake()
    {
        child_R = Get_ChildRectTransform(parent_G);
    }

    public RectTransform[] Get_ChildRectTransform(GameObject parent)
    {
        int sum_Child = parent.transform.childCount;
        RectTransform[] temporary_R = new RectTransform[sum_Child];
        for (int i = 0; i < sum_Child; i++)
            temporary_R[i] = parent.transform.GetChild(i).GetComponent<RectTransform>();
        return temporary_R;
    }
}

我的问题是... 堆栈中加载的函数中的“temporary_R”吗? 它在函数之后终止了吗? 否则,它会像我写的“new”和“array”一样加载到堆中吗?

temporary_R 它是一个引用数组 RectTransform 的局部变量。局部变量存储在堆栈中,并在函数 returns 时自动“释放”。即使我们通常不谈论 allocating/freeing 局部变量。

实际的 RectTransforms 存储在堆上,如果它是一个值 type/struct,则作为 array-object 的一部分,如果它是一个引用 type/class,则作为单独的一部分。这些对象将在垃圾收集器到达时被释放。

您通常不会担心这样的分配。 sum_Child 可能 相当小,因此内存量也应该受到限制。而且由于它只在很短的时间内保持活动状态,因此很可能会在 gen 0/1 中被收集,即廉价的垃圾收集。我还假设它 运行 很少见,比如每帧一次。

您通常只会在分配大对象(即 >~ 87kb)或非常频繁地分配(如在紧密循环内)时担心内存分配。即便如此,通常最好使用性能或内存分析器来检查分配率、GC 花费的时间等以确定是否存在问题。