从托管堆分配资源

     进程初始化时,CLR要保留一块连续的地址空间,这个地址空间最初并没有对应的物理空间。这个地址空间就是托管堆。托管堆还维护着一个指针,称为NextObjPtr。它指向下一个对象在堆中的分配位置。刚开始的时候,NextObjPtr设为保留地址空间的基地址。

     IL指令newobj用于创建一个对象。newobj指令将导致CLR执行以下步骤:

     1.计算类型(及其所有基类型)的字段所需要的字节数。

     2.加上对象的开销所需的字节数。每个对象都有两个开销字段:一个是类型对象指针和一个同步块索引对于32位应用程序,这两个字段各自需要32位,所以每个对象要增加8个字节。对于64位应用程序,这两个字段各自需要64位,所以每个对象要增加16个字节。

    3.CLR检查保留区域是否能够提供分配对象所需的字节数,如有必要就提交存储。如果托管堆有足够的可用空间,对象会被放入。注意对象是在NextObjPtr指针指向的地址放入的,并且为它分配的字节会被清零。接着,调用类型的实例构造器,IL指令将返回对象的地址,就在地址返回之前,NextObjPtr指针的值会加上对象占据的字节数,这样会得到一个新值,它指向下一个对象放入托管堆时的地址。

     假设:地址空间和存储是无限的。

原文地址:https://www.cnblogs.com/JustYong/p/4703439.html