从.NET的Stack <t>类弹出项目减少了内存使用量?

时间:2017-10-03 19:40:01

标签: c# .net memory-management stack

从.NET Stack<T>弹出一个项目是否会减少该堆栈的内存使用量?

MSDN说Stack<T>是作为一个数组实现的,所以我想通过弹出一个项目,只有顶部元素的指针被移动到前一个元素,保持所有元素不变。

有人知道吗?

2 个答案:

答案 0 :(得分:0)

不,堆栈的内存使用量保持不变。但是,如果T是引用类型且弹出元素没有其他实时引用,那么它最终可能会被GC收集并且弹出的实例的内存将被回收,但这不会影响任何方式本身堆栈的内存使用情况。

如果T是值类型,则它根本不会产生任何影响,因为任何给定的Tdefault(T)将具有相同的内存占用量。

答案 1 :(得分:-1)

查看源代码:https://referencesource.microsoft.com/#System/compmod/system/collections/generic/stack.cs,fd86d7436e55c84b,references

    // Pops an item from the top of the stack.  If the stack is empty, Pop
    // throws an InvalidOperationException.
    /// <include file='doc\Stack.uex' path='docs/doc[@for="Stack.Pop"]/*' />
    public T Pop() {
        if (_size == 0)
            ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EmptyStack);
        _version++;
        T item = _array[--_size];
        _array[_size] = default(T);     // Free memory quicker.
        return item;
    }

它没有调整数组的大小,但它确实将数组中的位置设置为default所以,如果它是引用类型,垃圾收集将清理以前的对象在那里,从而释放记忆。如果它是一个值类型,它将没有什么区别。