最好每次分配/解除分配IntPtr(AllocHGlobal)还是保留它?

时间:2011-01-04 23:29:40

标签: c# memory-management intptr

我的情况是我使用AllocHGlobal(总是大小相同)对我经常使用的函数(可能每秒30次),在我称之为FreeHGlobal的函数的末尾

如果我保留用AllocHGlobal分配的内存部分并在Dispose类中释放它或者每次调用函数时应该分配/释放它会更好吗?

我不知道这种记忆在c#中是如何表现的,对我来说这是一个“新世界”

3 个答案:

答案 0 :(得分:2)

30秒是永恒的。将FreeHGlobal置于finally块中以确保它的发布更容易。使您无需做终结者和IDisposable歌曲和舞蹈。好吧,客户的代码。

支持缓存堆缓存并不会开始有效,直到达到毫秒范围。

答案 1 :(得分:1)

与任何性能问题一样 - 首先编写干净的代码,测量并优化所需的内容。

如果您非常确定您的对象永远不会被多个线程使用(从而同时调用相关函数),那么缓存已分配的内存似乎没问题。

如果你决定缓存依赖于垃圾收集的无人值守内存块,那么就不足以尽早释放内存。未管理的内存(AllocHGlobal)不计入CLR分配的内存,因此可能会延迟对象的垃圾收集)。您应该在对象上实现并正确使用IDisposable。

答案 2 :(得分:0)

你可以这样做:

  • 所需的内存量始终小于或等于分配的大小。 (您已经表明情况确实如此。)
  • 一次不会从多个线程调用该方法。
  • 该方法不可重入。
  • 当不再需要时,你会小心释放内存。 (换句话说,如果指针保存在非静态类字段中,则该类应该实现IDisposable并且Dispose()方法应该释放内存。当然,类消费者将拥有致电Dispose()或使用using(){}阻止。)

但是,P / Invoke呼叫的实际封送更有可能成为瓶颈。您是否真的对代码进行了分析,还是进行了微观优化?