自定义内存分配器或内存池

时间:2012-01-30 11:20:48

标签: c# memory heap allocation

我正在使用第三方网络库,为了发送网络消息,我需要创建NetworkMessage类的新实例。这是低效的,因为应用程序需要运行得非常快并且周围发送了大量消息,因此我正在寻找一种方法来避免为每条消息分配动态内存。

如果NetworkMessage是一个结构,那么我们就不会有问题。此外,我无法存储一些预先创建的NetworkMessage实例,因为消息参数只能在构造函数中传递,以后不能更改它们。我无法改变NetworkMessage课程中的任何内容,因为它是第三方。

有没有办法在C#中创建内存池,然后使用与C ++中的placement new操作符类似的东西从该池创建对象? (我知道C#中没有放置新的运算符)。我正在寻找一种方法来初始化一块内存,然后使用该内存的块来创建NetworkMessage类的实例。

2 个答案:

答案 0 :(得分:1)

在我们继续之前,有一句话:内存分配在.NET中是超级高效的。这不像在COM中那样昂贵。

话虽如此,我看到两个解决方案:

您可以做的一件事就是自己创建一个NetworkMessage实例池。然后您可以使用简单的经理类来接收它们并从池中释放它们。

另一种选择是使用控制容器的反转,例如Castle WindsorUnityNInject。此类容器为您处理依赖项创建和对象生存期管理。

祝你好运!

答案 1 :(得分:1)

NetworkMessage在构造函数中作为输入参数使用了什么?

是否需要一个字节数组?如果是这种情况,这将是更好的池,而不是NetworkMessage类本身。

Microsoft有一个Networking Sample,它说明了大型字节数组的汇集在Sample Async Socket服务器中的工作原理