微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否在堆栈上分配值类型的本地数组并立即收集垃圾?

如何解决是否在堆栈上分配值类型的本地数组并立即收集垃圾?

public static Vector2[] To1DArray(this Vector2[,] grid)
{
    Vector2[] array = new Vector2[grid.Length];
    for (int i = 0; i < grid.GetLength(0); i++)
    {
        for (int j = 0; j < grid.GetLength(1); j++)
        {
            array[grid.GetLength(1) * i + j] = grid[i,j];
        }
    }
    return array;
}

我说的是我在函数的第一行中创建的 Vector2 结构数组。

解决方法

您正在返回该数组。这意味着正在返回引用,因此数组肯定不会被垃圾收集。除非您使用“不安全模式”,否则 C# 永远不会释放您引用的内存等(与 C++ 不同,如果您使用错误)。

在我上面的评论中,我认为您的问题与故意只存在于一个函数中的数组的性能有关。 不过,您的函数可以安全使用。

,

数组在堆上。

但总的来说,您不必为此担心太多。

如果你真的这样做了,你应该研究一下“阵列池”。特别是如果您的网格始终具有相同的大小。

顺便说一下,两个数组在内存中都是线性存储的。

您可以简单地使用 Buffer.BlockCopy

var array = new Vector2[grid.Length];
Buffer.BlockCopy(grid,array,grid.Length * 2 * sizeof(float));
return array;

在它们之间进行转换。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。