2016-03-03 31 views
0

考虑以下几点:数组属性是否导致堆上的内存分配?

public class FooBar { 
    public int[] SomeNumbers { 
     get { return _someNumbers; } 
     private set; 
    } 

    private int[] _someNumbers; 

    public FooBar() { 
     _someNumbers = new int[2]; 
     _someNumbers[0] = 1; 
     _someNumbers[1] = 2; 
    } 
} 

// in some other method somewhere... 

FooBar foobar = new FooBar(); 
Debug.Log(foobar.SomeNumbers[0]); 

什么我不知道的,不调用SomeNumbers属性导致堆分配;基本上它会导致数组的副本被创建,还是只是一个指针?

我问,因为我试图解决由于返回数组功能的一些GC的问题我有,我想确保我的缓存一些这样的价值观的理念将真正发挥作用

+0

数组通过引用传递/返回,所以是的,你的属性基本上只是返回一个指针。 –

回答

1

数组始终引用类型,所以是的,它是“基本上返回一个指针”。

如果您尝试调试内存问题,我建议使用内存分析器。有一个built in to Visual Studio或者你可以使用第三方(我个人喜欢DotMemory,它有5天免费试用)。使用探查器将帮助您确定什么是创建内存对象,以及如何保持内存对象活着。

+0

谢谢Scott;我要标记这个答案。至于性能分析,这是Unity发现的一个问题,它是剖析器。我知道是什么导致了GC峰值(我每个帧都会创建数百个新阵列)。我只是想确保我的解决方案不仅仅是过度分配堆的另一种方式。 haha – dmarra

+0

Unity 5现在在其免费版中包含它的分析器(它仅在4版付费版本中),因此找出哪些脚本正在创建阵列也很有用。 –

+0

是的,我知道;我正在使用它。深刻的剖面显示了尖峰发生的地方;我有一组方法都创建小数组,但数百帧(他们返回数组)。我试图改变他们所有现在不返回数组,并聪明地使用缓存值 – dmarra

相关问题