【问题标题】:object creation in stack在堆栈中创建对象
【发布时间】:2009-07-28 14:42:03
【问题描述】:

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

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

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

【问题讨论】:

  • 你的意思是你自己的堆栈?还是在对象堆栈中?
  • 你的问题不清楚(我不知道你在找什么)。你的问题可能会被关闭,除非你能澄清你在寻找什么
  • 类 abc { int i=1; } abc a1=新 abc();现在,这里的对象是在堆中创建的。那么,由于对象的大小不大,有什么方法可以在ram的堆栈内存中创建对象?

标签: c# .net memory-management object


【解决方案1】:

.NET 引用类型总是存在于 GC 堆上。不可能在其他地方拥有它们。甚至支持诸如

之类的 C++/CLI
System::Random rnd;
rnd.Next();

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

也就是说,正如 Eric Lippert 所说,the stack is an implementation detail 您应该主要关心您创建的类型的引用或值语义。

【讨论】:

    【解决方案2】:

    如果您使用struct 而不是class,您将创建一个将在堆栈上创建的值类型。关于这个有lots of things to considerFramework Design Guidelines 一书没有提出具体的建议,但表明最好对差异进行基准测试并确定是否真的值得实现一个值类型。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          了解cpu堆栈的兴趣。您必须学习 cpu 的工作原理(汇编语言)。在堆栈上分配空间是一个准瞬时且非常精确的分配/空闲内存块,因为它只是一个要更改的寄存器值。在堆上分配需要算法研究,最终在磁盘上分配空间等。如果你有 Point、PointF 这样的小结构,那么访问堆栈内存而不是在堆上为一些临时微结构保留大空间页面是非常重要的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-12-15
            • 2010-12-08
            • 2013-10-26
            • 2014-11-12
            • 1970-01-01
            • 2023-03-18
            • 2012-08-12
            • 2014-10-23
            相关资源
            最近更新 更多