C# 从.NET弹出项目';s堆栈<;T>;类减少内存使用?

C# 从.NET弹出项目';s堆栈<;T>;类减少内存使用?,c#,.net,memory-management,stack,C#,.net,Memory Management,Stack,从.NET的堆栈中弹出一个项目是否会减少该堆栈的内存使用 MSDN说,Stack被实现为一个数组,所以我猜通过弹出一个项目,只有顶部元素的指针被移动到前一个元素,保持所有元素不变 有人知道吗?看看源代码: //从堆栈顶部弹出一个项目。如果堆栈为空,则弹出 //抛出InvalidOperationException。 /// 公共广播电台{ 如果(_size==0) ThrowHelper.ThrowInvalidOperationException(例外资源.无效操作\u清空堆栈); _版本+

从.NET的
堆栈中弹出一个项目是否会减少该堆栈的内存使用

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


有人知道吗?

看看源代码:

//从堆栈顶部弹出一个项目。如果堆栈为空,则弹出
//抛出InvalidOperationException。
/// 
公共广播电台{
如果(_size==0)
ThrowHelper.ThrowInvalidOperationException(例外资源.无效操作\u清空堆栈);
_版本++;
T项=_数组[--_大小];
_数组[_size]=默认值(T);//更快地释放内存。
退货项目;
}

它不会调整数组的大小,但会将数组中的位置设置为
默认值
,因此,如果它是引用类型,垃圾收集将清除以前存在的对象,从而释放内存。如果它是一个值类型,则不会产生任何影响。

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


如果
T
是一种值类型,那么它根本没有区别,因为任何给定的
T
默认值(T)
将具有相同的内存占用。

每次添加/删除元素时不断调整数组大小不是很昂贵吗?当您在自己的应用程序中实际从堆栈中删除项时会发生什么情况?内存使用率下降了吗?没有,只有TrimOverse()会这样做。它有个好名字。不要经常使用它,它很昂贵。据我所知,它不会缩小到更小的大小,它只会将指针向后移动(至少对于不带trimOverse()的列表是这样)。不过,我很想听到更多。您看到阵列在哪里调整大小?对不起,您是对的,它实际上没有调整大小。只更改了
\u size
的值。更“正确”的说法是,以前位于数组最后位置的项目将被收集(最终)。值本身不会设置为
默认值
,而是数组的最后一个(可用)元素设置为默认值。
    // 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;
    }