C# 使用Marshal.AllocHGlobal时GC.AddMemoryPressure是否合适?

C# 使用Marshal.AllocHGlobal时GC.AddMemoryPressure是否合适?,c#,.net,garbage-collection,C#,.net,Garbage Collection,做 隐式添加内存压力(一个la GC.AddMemoryPressure)?是的,它正在分配非托管内存,但在“CLR看不见”的情况下,它并没有这样做。我可以看到一个关于添加或不添加的参数 看起来它可以(也许应该)。但是我需要知道它实际上是做什么的。根据(或for),不,它不调用GC.AddMemoryPressure“是IntPtr ip=Marshal.AllocHGlobal(size);隐式增加内存压力(一个la-GC.AddMemoryPressure)?”如果我理解你的问题,答案是否定

隐式添加内存压力(一个la GC.AddMemoryPressure)?是的,它正在分配非托管内存,但在“CLR看不见”的情况下,它并没有这样做。我可以看到一个关于添加或不添加的参数


看起来它可以(也许应该)。但是我需要知道它实际上是做什么的。

根据(或for),不,它不调用
GC.AddMemoryPressure

“是
IntPtr ip=Marshal.AllocHGlobal(size);
隐式增加内存压力(一个la-GC.AddMemoryPressure)?”如果我理解你的问题,答案是否定的。如果它是隐含的,我们就不需要it@TheGeneral-我一直认为AddMemoryPressure用于类似于
Activator.CreateInstance(type)
的东西,它返回一个大小不确定的对象。类似地,从
DllImport
函数返回的任何指针或对象都会落在同一条船上(如果它们被保留足够长的时间而产生影响的话)。AllocHGlobal的不同之处在于,作为CLR函数,它本身可以增加内存压力,而
CreateInstance
DllImport
函数则不能实际上这是一种倒退,
Activator.CreateInstance
只是一种普通的托管方法,它创建托管对象,而托管对象可能创建非托管内存,也可能不创建非托管内存。垃圾收集器知道它正在使用它创建的类型。它唯一不知道的是,您正在使用非托管内存做什么,因此无法提供作为垃圾收集器的最佳服务。因此我们有了这些方法,但我需要知道它的实际功能。FYI:我使用了AllocHGlobal和FreeHGlobal的包装器,所以添加AddMemoryPressure非常简单(大小就在那里)。添加RemoveMemoryPressure是一项挑战,因为通常免费调用只获取指针,而不获取大小。幸运的是,这里使用的分配器有一个函数可以将指针转换为大小(来自kernel32.dll)。虽然Marshal没有一个方法,但PInvoking似乎很好用。
IntPtr ip = Marshal.AllocHGlobal(size);