在堆或堆栈上分配?

时间:2015-05-27 13:45:44

标签: c# memory stack heap

我最近问了一个关于StackOverflowExeptions的问题,解释非常有用! 但是,我编写了一个方法并尝试找出T cached的分配位置(堆/堆栈):

private Dictionary<Type, Component> _cachedComponents = new Dictionary<Type, Component>();

public T GetCachedComponent<T>() where T : Component {
   //Not yet sure if the next line works or throws an exception -> just ignore it
    if(_cachedComponents[typeof(T)] != null) {
        return (T)_cachedComponents[typeof(T)]
    } else {
        T cached = this.GetComponent<T>();
        _cachedComponents.Add(typeof(T), cached);
        return cached;
    }
}
  1. 由于T cached在方法中被声明,我认为它是在堆栈上分配的,对吧?
  2. 但是引用然后被添​​加到字典中,应该在堆上分配,对吧?
  3. 方法返回后,堆栈被“清除”,对吧?
  4. 但是T cached会发生什么?
    它是否会被移动到堆中?(因为堆栈不再“携带数据”,但字典仍然有一个参考)

1 个答案:

答案 0 :(得分:0)

  

由于T cached是在方法中声明的,我认为它是分配的   在堆栈上,对吗?

在方法中分配的

T不会影响它在堆或堆栈上。无论是前者还是后者的决定都取决于这是引用类型还是值类型。

  

但是引用会被添加到字典中,应该是   在堆上分配,对吧?

将引用添加到Dictionary<TKey, TValue>后,密钥将存储在字典中,该字典在堆上分配,因为它是引用类型。

  

方法返回后,堆栈被“清除”,对吗?

方法返回后,清除堆栈

  

但是T缓存会发生什么?它会被移到堆中吗?

如果T缓存在字典中,那么它已经在堆上分配。

总的来说,我假设您就这些问题提出一般性知识。你不应该过多地担心这一点,因为我在这里写的是一个实现细节,可能会有所变化。