我的问题是在我的c#程序中(我只有c#代码和xaml文件)什么类型的对象将进入托管堆,什么类型的本机堆?如何在应用程序运行时指定每个堆的最大大小?我假设GC只在托管堆上运行,这是正确的吗?
答案 0 :(得分:17)
当您使用C#中的new运算符(或任何其他CLR语言中的相应运算符)创建对象时,.NET运行时在“托管堆”中分配内存(只是由.NET运行时管理的堆+垃圾收集器)。实际上,这是两个堆中的一个 - 一个用于小于85K的对象,另一个用于大于此的对象(大型阵列等)。无论哪种方式,当分配这样的对象时,您不会像在本机代码中那样返回描述已分配空间地址的真实指针。你得到的是一个“句柄”,它表示该内存地址的间接。这种间接存在是因为GC收集并压缩堆时实际的内存位置可能会发生变化。
但是,如果要与需要指针的非托管/本机代码进行通信,则需要使用指针,而不是句柄。 .NET提供了两种方法将.NET句柄转换为可以传入非托管代码的原始指针。
我希望这有帮助!