我知道new
关键字正在调用类构造函数,但是我们在哪个阶段为类分配内存?
根据我的理解,它应该与GCHandle.Alloc(Object)
方法相对应,但我无法找到连接。
答案 0 :(得分:16)
new 运算符在CLR中实现。它从垃圾收集堆中分配内存并执行类构造函数。
GCHandle.Alloc()不相同。这利用了GC中的单独机制来创建对对象的引用,存储在单独的表中的引用以及除了在垃圾收集期间通常找到的对象引用之外还要进行扫描。您必须传递Alloc()一个现有的对象引用,它会添加另一个。用于创建弱和固定引用以及允许非托管代码存储对托管对象的引用并使其保持活动状态的机制很有用。 C ++ / CLI中的gcroot<> template class利用了它。
答案 1 :(得分:10)
对象创建的所有内容都隐藏在newobj
操作码(或initobj
的值 - 类型)后面。因此,完全是一个实现细节分配内存的方式和位置,以及它与其他内存管理结构的关系。