【问题标题】:Do array properties cause memory allocation on the heap?数组属性会导致堆上的内存分配吗?
【发布时间】:2016-06-17 02:20:05
【问题描述】:

考虑以下几点:

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 问题,并且我想确保我缓存一些像这样的值的想法实际上会有所作为

【问题讨论】:

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

标签: c# arrays properties garbage-collection heap-memory


【解决方案1】:

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

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

【讨论】:

  • 谢谢斯科特;我将把这个标记为已回答。至于分析,这是 Unity 从分析器中揭示的一个问题。我知道导致 GC 峰值的原因(我每帧制作数百个新数组)。我只是想确保我的解决方案不仅仅是一种过度分配给堆的不同方式。哈哈
  • Unity 5 现在在其免费版中包含了它的分析器(仅在 4 中的付费版中),找出创建数组的脚本也很有用。
  • 是的,我知道;我正在使用它。深度剖面揭示了尖峰出现的位置;我有一组方法都可以创建小数组,但每帧数百次(它们返回数组)。我现在正在尝试将它们全部更改为不返回数组,并巧妙地使用缓存值
  • 好的,很酷。起初并不清楚您是从分析中发现这个问题,还是只是假设数组创建是问题的根源。
猜你喜欢
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
相关资源
最近更新 更多