从.NET Stack<T>
弹出一个项目是否会减少该堆栈的内存使用量?
MSDN说Stack<T>
是作为一个数组实现的,所以我想通过弹出一个项目,只有顶部元素的指针被移动到前一个元素,保持所有元素不变。
有人知道吗?
答案 0 :(得分:0)
不,堆栈的内存使用量保持不变。但是,如果T
是引用类型且弹出元素没有其他实时引用,那么它最终可能会被GC收集并且弹出的实例的内存将被回收,但这不会影响任何方式本身堆栈的内存使用情况。
如果T
是值类型,则它根本不会产生任何影响,因为任何给定的T
或default(T)
将具有相同的内存占用量。
答案 1 :(得分:-1)
// 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
所以,如果它是引用类型,垃圾收集将清理以前的对象在那里,从而释放记忆。如果它是一个值类型,它将没有什么区别。