c# - 自定义内存分配器或内存池

标签 c# memory heap-memory allocation

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

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

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

最佳答案

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

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

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

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

祝你好运!

关于c# - 自定义内存分配器或内存池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9063038/

相关文章:

c# - 如何不使用 XmlSerializer 编写基于值的元素?

c# - 当 Nullable<bool> 为 Null 时,无法将其保存到 Azure 表

embedded - ARM 上的堆分析

pointers - RAM 中的静态指针是什么,它们如何存在?

java - 如何在 java 中增加 Netbeans 平台应用程序的堆内存?

c++ - 堆数据困惑

c# - 使用 C# 从 Access 数据库读取条目到 DataGridView

c# - 设计器中的自定义控件未处理的异常

java - 在 Java 内存游戏中,如何触发已发现的 2 个未知数,并让它们在游戏的其余部分保持显露出来?

.net - .NET 可达到的最大内存?