在C#中分配堆栈大小?

时间:2011-07-22 17:22:44

标签: c# stack allocation vm-implementation

我正在为我一直在研究的字节码语言开发一个虚拟机。我正在使用System.Collections.Generic.Stack类作为堆栈,但有没有办法分配堆栈大小?或者我只需要编写自己的堆栈对象来使用?

6 个答案:

答案 0 :(得分:4)

MSDN到Stack(Int32)构造函数:

  

Stack的容量是Stack的元素数量   能把持住。当元素添加到堆栈时,容量为   根据需要通过重新分配内部自动增加   阵列。

     

如果可以估计集合的大小,请指定初始值   容量消除了执行大量调整大小的需要   向堆栈添加元素时的操作。

     

通过调用TrimExcess可以减少容量。

     

这个构造函数是一个O(n)操作,其中n是容量。

答案 1 :(得分:3)

你可以construct it with an initial capacity,但是堆栈会根据需要增长(当你向它添加项目时)。

如果你不希望它在你超过它的容量时自动添加新项目,你需要将它封装在你自己的类中,或者编写你自己的Stack来删除多余的项目。

答案 2 :(得分:2)

您可以使用Stack<T> Constructor (Int32)来指定堆栈的容量:

var stack = new Stack<Foo>(1024);

请注意,如果添加超过1024个项目,堆栈将增加容量。如果您不想这样,可以在每次推送之前检查堆栈大小:

if (stack.Count == 1024)
    throw new StackOverflowException();
stack.Push(foo);

答案 3 :(得分:1)

您的术语还有很多不足之处,但Stack有一个构造函数可以让您传递初始容量:http://msdn.microsoft.com/en-us/library/ahc986x9.aspx

虽然堆栈可以随着内存的增长而自由增长,所以你不必担心!

答案 4 :(得分:1)

答案 5 :(得分:0)

Stack(T)Class

  

表示可变大小的后进先出(LIFO)集合   相同任意类型的实例。

它动态调整大小。但是,如果您想预先分配其大小,请查看documentation on the Stack's constructor。有一个重载可以设置堆栈的初始大小。