【问题标题】:When is memory allocated in the .NET compact framework?.NET 紧凑框架中何时分配内存?
【发布时间】:2008-10-29 18:28:35
【问题描述】:

.NET 紧凑框架中的内存何时分配?如果值类型和引用类型之间存在差异,请详细说明。文件或确认步骤表示赞赏。

特别是考虑这种情况......

private MyClass item;  // here?

public void MyMethod()
{
    item = new MyClass();  // or here?
}

【问题讨论】:

    标签: .net memory compact-framework


    【解决方案1】:

    有 3 种不同的内存分配方式。

    静态:

    这些是在编译时绑定和分配的。例如全局静态变量。

    堆栈动态:

    这些在运行时绑定并推送到堆栈上。比如函数调用中的局部变量。

    堆动态:

    现在堆动态也有一些不同的“子类别”,例如隐式和显式,但我不会详细介绍。

    当你声明时

    private MyClass item;  // here?
    

    对 MyClass 的引用被压入堆栈。它只是一个参考,仅此而已。此时它的值为 null。

    public void MyMethod()
    {
        item = new MyClass();  // or here?
    }
    

    此时通过调用“new MyClass()”在堆上显式分配内存,然后 item 引用它。

    所以实际上,在您调用 MyMethod 之后,您有 2 个变量。一个名为 item 的引用类型,以及一个 myClass 类型的 item 引用的未命名变量。

    【讨论】:

      【解决方案2】:

      这是一个棘手的问题,这让我比我想象的更喜欢它。 :)

      让我们从基础开始:

      声明一个变量不会直接为它在引用类型上分配内存*。它确实在值类型上这样做,因为值类型在声明点被初始化。对于引用类型,对象的存储空间是在进入其构造函数时分配的。

      *什么时候不适用?

      • 在第一次使用给定类时(很可能是您的第一行),任何类级别的静态数据都会被初始化,并且如果该类有一个静态构造函数(可能会分配内存),它将被称为出色地。因此,您实际上可以在变量声明中分配一些内存(用于静态成员)。
      • 从技术上讲,声明引用类型变量确实会在堆栈上分配一些内存(正如 Nicholas Mancuso 所提到的)——分配的内存是用于引用对象的堆栈级存储。 (不可否认,上述引用是null,但是一旦初始化对象,分配的内存中就会存在有效的引用。)

      我强烈推荐这个C-Sharp Corner article,了解更多关于堆栈和堆分配的信息。

      【讨论】:

      • 非常好的答案,添加了尼古拉斯留下的一些暗示。我会投票,但他得到了答案。谢谢!
      • 他应该这样做;他的回答更彻底。 :) 他和我几乎同时回答,只差一分钟左右。 :)
      【解决方案3】:

      我强烈建议您查看 Compact Framework Memory Management 上的 MSDN Webcase。它与在桌面上的工作方式并不完全相同,本次演讲涵盖了很多细节和图形,以帮助理解 GC 堆。

      【讨论】:

      • 链接是msevents.microsoft.com/cui/…>
      • 但是活动结束了,我找不到视频或演示文稿的上传。
      • 只需注册,它会给你一个下载链接。这不是很直观。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2010-09-18
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多