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

C# 自定义内存分配器或内存池,c#,memory,heap,allocation,C#,Memory,Heap,Allocation,我正在使用第三方网络库,为了发送网络消息,我需要创建NetworkMessage类的新实例。这是低效的,因为应用程序需要运行得非常快,并且有很多消息要发送,所以我正在寻找一种方法来避免为每条消息动态分配内存 如果NetworkMessage是一个结构,那么我们就不会有问题。此外,我无法存储大量预创建的NetworkMessage实例,因为消息参数只能在构造函数中传递,以后无法更改。我无法更改NetworkMessage类中的任何内容,因为它是第三方 有没有一种方法可以在C++中创建内存池,然后使

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

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


有没有一种方法可以在C++中创建内存池,然后使用类似于C++中的放置新操作符来创建池中的对象?(我知道C#中没有新的运算符)。我正在寻找一种方法来初始化一个内存块,然后使用该内存块从中创建

NetworkMessage
类的实例。

在继续之前,请注意:在.NET中,内存分配非常高效。它不像在COM中那样是一个昂贵的操作

尽管如此,我看到了两种解决方案:

您可以做的一件事是自己创建一个NetworkMessage实例池。然后您可以使用一个简单的管理器类将它们从池中释放出来

另一个选项是使用控制容器的反转,例如,或。这些容器为您处理依赖项创建和对象生存期管理


祝你好运

NetworkMessage在构造函数中采用什么作为输入参数

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


Microsoft提供了一个示例,说明了大字节数组池如何在示例异步套接字服务器中工作

您是否实际测量到此分配问题导致了速度减慢?net分配器和GC针对“小的短期对象的负载”情况进行了大量优化。如果你只是猜测,你很可能是错的。正如其他人所说,你绝对确定这是你的瓶颈吗?
NetworkMessage
到底是什么样子?它是密封的吗?伙计,这就是dotNet垃圾收集堆。你已经在做了。谢谢大家的评论。你是对的,我不确定这是否会成为瓶颈,因为我们仍处于早期开发阶段。这只是对未来的思考,如果它成为瓶颈,来自C++背景,我就不知道内存分配是对C中的微小短命对象的优化。所以我想这不会是个问题。我很担心,因为每分钟将创建数千条消息。我认为池在这里不起作用,因为只有在需要消息时才知道参数,并且必须将参数传递到构造函数中。我看不出国际奥委会在表现上会有什么不同。谢谢你的回复。正如我上面所说的,我不知道C#是为小型动态分配而优化的!如果下议院的选民能激发他们的下议院投票,那就太好了!这是一个很好的观点-这个类的参数是键值对对象,可以在对象池中预先创建,所以如果内存分配真的成为一个问题,我一定会考虑这样做!