C#中 Queue是连续内存吗?

fssssssss 2012-05-05 05:49:02
我看了MSDN感觉好像是连续内存
不过我感觉像Stack Queue这种集合,为什么要用连续内存呢?
如果用非连续内存效率应该会高一些啊?
不理解,求问

另外,Queue中的TrimExcess是什么意思啊?我看MSDN上的解释,没看懂!
...全文
490 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
可以看看压入和弹出队列元素时的源代码
public void Enqueue(T item)
{
if (this._size == this._array.Length)
{
int capacity = (int) ((this._array.Length * 200L) / 100L);
if (capacity < (this._array.Length + 4))
{
capacity = this._array.Length + 4;
}
this.SetCapacity(capacity);
}
this._array[this._tail] = item;
this._tail = (this._tail + 1) % this._array.Length;
this._size++;
this._version++;
}

public T Dequeue()
{
if (this._size == 0)
{
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EmptyQueue);
}
T local = this._array[this._head];
this._array[this._head] = default(T);
this._head = (this._head + 1) % this._array.Length;
this._size--;
this._version++;
return local;
}


不用去过度神秘地纠缠“内存”这个词儿。应该看方法本身。
  • 打赏
  • 举报
回复
假设你写
ABC[] x= new ABC[10];
的时候,关“连续内存”什么事?

而队列、集合等也就是如此。它声明了数组用于保存对象,然后当你插入第11个对象时,它就重新实例化
x= new ABC[20];
然后把10个对象(引用)拷贝进去;当你插入第21个对象时,它再次实例化
x= new ABC[40];
......

这些数组的大小跟你说的“内存大小”有多大关系?跟你说的“连续内存”的关系呢?
stonespace 2012-05-06
  • 打赏
  • 举报
回复
queue有点类似win32平台的消息队列,其实就是一个变长数组,类似List<T>,虽然它是个连续的数组,但头部位置不固定,所以没有前面空多少后面空多少的问题,

比如queue有32个元素的空间的话,假设队列头在第5个位置,队列一共有28个元素,这时最后一个元素在第32个位置,但此时还能加入元素,新加入元素,也就是29个元素会折回头,占据第一个位置,这样所有连续空间都可以被利用,

没有前面后面的区别,空闲空间其实也是连续的(循环看),

占用空间的比例,其实很简单,queue如果有32个元素空间,里面实际有29个元素的话,占用比例就是29/32,

对于TrimExcess,按照msdn的说法,如果占用空间大于90%,则TrimExcess什么都不做,比如如果有32个空间,已经有了30个元素的话,调用TrimExcess则什么都没做,一个空间也没有释放,只有占用空间小于90%的时候,TrimExcess会分配另外一块连续内存,空间大小刚好等于元素个数,这样调用TrimExcess后,占用空间将是100%,



[Quote=引用 3 楼 的回复:]

stonespace请问,在没用TrimExcess和用了TrimExcess的情况下,多余内存是多少吗?

前面是空多少,后面是空多少,平均占百分之多少?
额,就是说Queue到底大概是怎么写的,怎么考虑的?

我记得之前面试的时候,我说Queue用了内存占总内存的1/3,实际是怎样的呢?
[/Quote]
threenewbee 2012-05-05
  • 打赏
  • 举报
回复
from msdn

Queue<T> 的容量是指 Queue<T> 可以容纳的元素数。 当向 Queue<T> 添加元素时,将通过重新分配内部数组,根据需要自动增大容量。 可通过调用 TrimExcess 来减少容量。

这说明它的确是连续的。不过对于引用类型,这关系不大。
fssssssss 2012-05-05
  • 打赏
  • 举报
回复
stonespace请问,在没用TrimExcess和用了TrimExcess的情况下,多余内存是多少吗?

前面是空多少,后面是空多少,平均占百分之多少?
额,就是说Queue到底大概是怎么写的,怎么考虑的?

我记得之前面试的时候,我说Queue用了内存占总内存的1/3,实际是怎样的呢?
stonespace 2012-05-05
  • 打赏
  • 举报
回复
因为Queue是连续内存,所以分配空间通常会比使用大得多,TrimExcess只是用来减少占用的多余内存的数量,
stonespace 2012-05-05
  • 打赏
  • 举报
回复
Queue先进先出,一般元素个数不多,使用连续内存更节省空间,

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧