我知道
在我看来,它应该对应于
new
关键字调用类的构造函数,但我们在哪个阶段分配类的内存呢?在我看来,它应该对应于
GCHandle.Alloc(Object)
方法,但我找不到联系。new
关键字调用类的构造函数,但我们在哪个阶段分配类的内存呢?GCHandle.Alloc(Object)
方法,但我找不到联系。new操作符是在CLR中实现的。它从垃圾回收堆中分配内存并执行类构造函数。
GCHandle.Alloc()并不相同。它利用GC中的另一种机制来创建对象的引用,这些引用存储在单独的表中,并且在垃圾回收期间除了正常发现的对象引用之外还会被扫描。您必须向Alloc()传递一个现有的对象引用,它会添加另一个引用。有助于创建弱引用和固定引用,并允许非托管代码存储对托管对象的引用并使其保持活动状态。C++/CLI中的gcroot<>模板类也利用了它。
对象创建的所有内容都隐藏在newobj
操作码后面(值类型使用initobj
)。因此,内存的分配方式和位置以及与其他内存管理结构的关联是完全实现细节。