堆栈中的对象创建

时间:2009-07-28 14:42:03

标签: c# .net memory-management object

我可以在堆栈中创建关于.net和C#的类对象吗? 例如:

class abc { int i=1; } 
abc a1=new abc(); 

现在,这里的对象是在堆中创建的。那么,如果对象的大小不大,有没有办法在ram的堆栈内存中创建对象?

5 个答案:

答案 0 :(得分:8)

.NET引用类型始终存在于GC堆上。它不可能在别处。甚至是支持

等内容的C ++ / CLI
System::Random rnd;
rnd.Next();

看起来像堆栈变量,实际上是在GC堆上创建Random类(如果它实现Dispose,则在块的末尾调用它的IDisposable方法。)< / p>

如上所述,正如Eric Lippert所说,the stack is an implementation detail并且您应该主要关注您创建的类型的引用或值语义。

答案 1 :(得分:2)

如果使用struct而不是class,则创建将在堆栈上创建的值类型。关于此问题lots of things to consider。本书框架设计指南没有提出具体的建议,但表明最好对差异进行基准测试,并确定是否真的值得实现价值类型。

答案 2 :(得分:0)

正如Mehrdad所说,引用类型实例(对象)与静态变量一样存储在堆上。局部变量等存储在堆栈中。

答案 3 :(得分:0)

我不知道为什么你需要堆栈上的对象而不是堆。主要原因(至少我知道的主要原因)是RAII。 c ++中的编译器保证在堆栈上创建的每个对象在离开作用域时都会被销毁。

在C#中,您使用using语句归档相同的内容:http://msdn.microsoft.com/en-us/library/yh598w02.aspx

答案 4 :(得分:0)

了解cpu堆栈的用途。您必须学习cpu的工作方式(汇编语言)。在堆栈上分配空间是一个准瞬时且非常精确的分配/可用存储块,因为它只是一个要更改的寄存器值。在堆上分配时需要进行算法研究,最终在磁盘上分配空间等。如果您没有Point,PointF之类的结构,那么访问堆栈内存而不是在堆上为一些临时的微结构保留大空间页非常重要。