函数中的引用变量加载到堆和栈之间的内存中在哪里?
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 花费的时间等以确定是否存在问题。
我已经创建了一个函数来从父游戏对象的所有子游戏对象中获取“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 花费的时间等以确定是否存在问题。